View previous topic :: View next topic |
Author |
Message |
schrippe Guru
Joined: 03 Mar 2004 Posts: 556 Location: Mülheim
|
Posted: Tue Aug 30, 2005 9:10 am Post subject: sed / awk frage: |
|
|
hallo,
an alle die besser awk können:
ich müsste aus dieser zeile (ist nen file mit insgesamt 5000 Zeilen)
Code: | Thu Aug 25 13:06:40 2005 1124968000006939 1 140 141 4 |
von dem string 1124968000006939 die letzten 6 Ziffern ausschneiden. der rest des file soll so bleiben.
danke _________________ for i in $(seq 1 565); do echo 'A$i: entweder rechts fahren oder rechts überholen dürfen!';done |
|
Back to top |
|
|
Earthwings Bodhisattva
Joined: 14 Apr 2003 Posts: 7753 Location: Germany
|
Posted: Tue Aug 30, 2005 10:10 am Post subject: |
|
|
Ausschneiden == entfernen?
Das ginge zum Beispiel folgendermaßen, falls der String immer 16 Zahlen enthält. Code: | sed "s/\([0-9]\{10\}\)[0-9]\{6\}/\1/" <datei> | Oder auch Code: | sed "s/[0-9]\{6\} / /" <datei> | Das dürfte etwas schneller sein, musst aber evtl. statt dem Leerzeichen die Whitespace-Klasse nehmen. _________________ KDE |
|
Back to top |
|
|
pablo_supertux Advocate
Joined: 25 Jan 2004 Posts: 2953 Location: Somewhere between reality and Middle-Earth and in Freiburg (Germany)
|
Posted: Tue Aug 30, 2005 10:29 am Post subject: |
|
|
Wenn du mit awk arbeiten willst, dann kannst du das hier versuchen:
Code: |
supertux@supertux:~> cat file.dat
Thu Aug 25 13:06:40 2005 1124968000006939 1 140 141 4
supertux@supertux:~> cat file.dat | awk '{string=$6; \
> len=length(string);
> nums = substr(string,0,len-6);
> for(i=1; i<NF; i++)
> if(i==6)
> printf("%s\t", nums);
> else
> printf("%s\t", $i);
> printf("\n"); }'
Thu Aug 25 13:06:40 2005 1124968000 1 140 141
|
_________________ A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth! |
|
Back to top |
|
|
schrippe Guru
Joined: 03 Mar 2004 Posts: 556 Location: Mülheim
|
Posted: Tue Aug 30, 2005 11:17 am Post subject: |
|
|
das sed sieht sehr gut aus.
schei* reguläre ausdrücke. kapiere die einfach nicht.
sed "s/\([0-9]\{10\}\)[0-9]\{6\}/\1/" gnu_apache2.file
wenn es nicht zuviel arbeit ist:?
was machen denn die einzelnen abschnitte? _________________ for i in $(seq 1 565); do echo 'A$i: entweder rechts fahren oder rechts überholen dürfen!';done |
|
Back to top |
|
|
Earthwings Bodhisattva
Joined: 14 Apr 2003 Posts: 7753 Location: Germany
|
Posted: Tue Aug 30, 2005 11:55 am Post subject: |
|
|
schrippe wrote: | das sed sieht sehr gut aus.
schei* reguläre ausdrücke. kapiere die einfach nicht.
sed "s/\([0-9]\{10\}\)[0-9]\{6\}/\1/" gnu_apache2.file
wenn es nicht zuviel arbeit ist:?
was machen denn die einzelnen abschnitte? |
Ist gar nicht so schwer zu verstehen, man darf sich nur nicht durch die vielen Klammern und Escapes verwirren lassen. Grundsätzlich ist die Syntax beim Ersetzen mit sed s/<regulärer Ausdruck>/<Ersatz>/<modifier>
[0-9] matcht alle einstelligen Zahlen von 0-9, also zB 3 oder 6.
{x,y} gibt an, das die vorangehenden Zeichen mindestens x und höchstens y mal vorkommen dürfen.
{x} ist kurz für {x,x}
[0-9]{10} trifft also auf alle zehnstelligen Zahlen zu.
Mit den Klammern darum ([0-9]{10}) wird sed angewiesen, den Inhalt des zutreffenden Strings zu speichern, so dass du ihn bei <Ersatz> mit \1 benutzen kannst.
([0-9]{10})[0-9]{6} weist somit sed an, eine zehnstellige Zahl direkt gefolgt von einer sechsstelligen Zahl zu suchen, und die zehnstellige Zahl in \1 zu speichern. _________________ KDE |
|
Back to top |
|
|
return13 Guru
Joined: 02 Feb 2004 Posts: 513 Location: Hamburg - Germany
|
Posted: Tue Aug 30, 2005 1:57 pm Post subject: |
|
|
nicht schlecht... hättest nicht lust hier ein kleines oder vielleicht auch etwas umfangreicheres sed|awk howto zu schreiben?
Will es zwar lernen, hab aber keine lust mir ein 600 seitigen Wälzer durchzulesen... deine Anleitung war kurz und verständlich... _________________ Wer Recht erkennen will, muß zuvor in richtiger Weise gezweifelt haben.
Aristoteles (384-322), griech. Philosoph, Begründer d. abendländ. Philosophie |
|
Back to top |
|
|
Anarcho Advocate
Joined: 06 Jun 2004 Posts: 2970 Location: Germany
|
|
Back to top |
|
|
return13 Guru
Joined: 02 Feb 2004 Posts: 513 Location: Hamburg - Germany
|
Posted: Tue Aug 30, 2005 8:51 pm Post subject: |
|
|
danke _________________ Wer Recht erkennen will, muß zuvor in richtiger Weise gezweifelt haben.
Aristoteles (384-322), griech. Philosoph, Begründer d. abendländ. Philosophie |
|
Back to top |
|
|
|