Hallo, ich muss aus eine sequenziell nummerierten Datei Zeilen löschen, wie kann ich die Nummerierung wiederherstellen. Ich habe mich mit awk versucht, leider erfolglos. Hier ist eine Beispieldatei Zeilen 4 und 5 sind gelöscht. Die Nummerierung (Stelle 6 bis 15) möchte ich wieder ohne Lücke herstellen. FHEAD000000000120051209230059JST THEAD0000000002ASNOut ASNOutCre THDID000000000370000014787000001478 TACNT0000000006 000000000000000000000000 TITEM000000000704029049262596-SKU 0000000 TTAIL00000000080000000005 THEAD0000000009ASNOut Schon jetzt vielen Dank Michael This e-mail (and/or attachments) is confidential and may be privileged. Use or disclosure of it by anyone other than a designated addressee is unauthorized. If you are not an intended recipient, please delete this e-mail from the computer on which you received it. We thank you for notifying us immediately.
Am Dienstag, 13. Dezember 2005 22:49 schrieb Michael Hoeller:
FHEAD000000000120051209230059JST THEAD0000000002ASNOut ASNOutCre THDID000000000370000014787000001478 TACNT0000000006 000000000000000000000000 TITEM000000000704029049262596-SKU 0000000 TTAIL00000000080000000005 THEAD0000000009ASNOut
etwa so:? ------------------------- doit.pl #!/bin/perl -w while (<>) { chomp; $_ =~ /^(.{6})(.{12})(.*)$/ ; my ($pre, $line, $post) = ($1,$2,$3); printf "%s%012d%s\n", $pre, $., $3; } ---------- Erzeugt: FHEAD000000000000151209230059JST THEAD0000000000002Out ASNOutCre THDID000000000000300014787000001478 TACNT0000000000004 000000000000000000000000 TITEM000000000000529049262596-SKU 0000000 TTAIL00000000000060000005 THEAD0000000000007Out ----- Aufruf: doit.pl datei.... oder doit.pl < datei Bye Jürgen PS: es gibt in Perl auch noch pack/unpack, aber da kenn' ich mich nicht mit aus. -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Am Mittwoch, 14. Dezember 2005 08:59 schrieb Dr. Jürgen Vollmer:
Am Dienstag, 13. Dezember 2005 22:49 schrieb Michael Hoeller:
FHEAD000000000120051209230059JST THEAD0000000002ASNOut ASNOutCre THDID000000000370000014787000001478 TACNT0000000006 000000000000000000000000 TITEM000000000704029049262596-SKU 0000000 TTAIL00000000080000000005 THEAD0000000009ASNOut
etwa so:? ------------------------- doit.pl #!/bin/perl -w
while (<>) { chomp; $_ =~ /^(.{6})(.{12})(.*)$/ ; my ($pre, $line, $post) = ($1,$2,$3); printf "%s%012d%s\n", $pre, $., $3; } ---------- Erzeugt:
FHEAD000000000000151209230059JST THEAD0000000000002Out ASNOutCre THDID000000000000300014787000001478 TACNT0000000000004 000000000000000000000000 TITEM000000000000529049262596-SKU 0000000 TTAIL00000000000060000005 THEAD0000000000007Out -----
Aufruf: doit.pl datei.... oder doit.pl < datei
Bye Jürgen
PS: es gibt in Perl auch noch pack/unpack, aber da kenn' ich mich nicht mit aus.
oder noch kürzer: while (<>) { chomp; $_ =~ /^(.{6})(.{12})(.*)$/ ; printf "%s%012d%s\n", $1, $., $3; } -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Hallo,
vielen Dank für das Script, scheint genau das zu sein was ich suche. Nur
sollte das Ergebnis wie folgt ausssehen:
D.h. die Struktur bleibt erhalten und nur die Nummerne ändern sich das ist
ab byte 6 in der Länge 10.
FHEAD000000000120051209230059JST
THEAD0000000002ASNOut ASNOutCre
THDID000000000370000014787000001478
TACNT0000000004 000000000000000000000000
TITEM000000000504029049262596-SKU 0000000
TTAIL00000000060000000005
THEAD0000000007ASNOut
Ich werde mit dem script etwas "spielen" und denke das ich es hinbekomme.
Kannst Du evt. die Zeilen kurz kommentieren dann ist das verstehen
einfache und dann haben all was davon
Vielen Dank noch für die schnelle Antwort
Michael
"Dr. Jürgen Vollmer"
Am Dienstag, 13. Dezember 2005 22:49 schrieb Michael Hoeller:
FHEAD000000000120051209230059JST THEAD0000000002ASNOut ASNOutCre THDID000000000370000014787000001478 TACNT0000000006 000000000000000000000000 TITEM000000000704029049262596-SKU 0000000 TTAIL00000000080000000005 THEAD0000000009ASNOut
------------------------- doit.pl #!/bin/perl -w
while (<>) { chomp; $_ =~ /^(.{6})(.{12})(.*)$/ ; my ($pre, $line, $post) = ($1,$2,$3); printf "%s%012d%s\n", $pre, $., $3; } ---------- Erzeugt:
FHEAD000000000000151209230059JST THEAD0000000000002Out ASNOutCre THDID000000000000300014787000001478 TACNT0000000000004 000000000000000000000000 TITEM000000000000529049262596-SKU 0000000 TTAIL00000000000060000005 THEAD0000000000007Out
This e-mail (and/or attachments) is confidential and may be privileged. Use or disclosure of it by anyone other than a designated addressee is unauthorized. If you are not an intended recipient, please delete this e-mail from the computer on which you received it. We thank you for notifying us immediately.
Am Mittwoch, 14. Dezember 2005 09:47 schrieb Michael Hoeller:
Hallo,
vielen Dank für das Script, scheint genau das zu sein was ich suche. Nur sollte das Ergebnis wie folgt ausssehen: D.h. die Struktur bleibt erhalten und nur die Nummerne ändern sich das ist ab byte 6 in der Länge 10.
FHEAD000000000120051209230059JST THEAD0000000002ASNOut ASNOutCre THDID000000000370000014787000001478 TACNT0000000004 000000000000000000000000 TITEM000000000504029049262596-SKU 0000000 TTAIL00000000060000000005 THEAD0000000007ASNOut
Ich werde mit dem script etwas "spielen" und denke das ich es hinbekomme. Kannst Du evt. die Zeilen kurz kommentieren dann ist das verstehen einfache und dann haben all was davon
------------------------- doit.pl #!/bin/perl -w
while (<>) { chomp; $_ =~ /^(.{6})(.{12})(.*)$/ ; -----------------------10 dan werden nur 10 Zeichen akzeptiert my ($pre, $line, $post) = ($1,$2,$3); printf "%s%012d%s\n", $pre, $., $3; -----------------010%d dann wird die Zahl 10-stellig mit führenden 0 ausgegeben.
}
hab' mich wohl verguckt. bye Jürgen PS: das kann man so auch mit AWK oder SED machen. Wenn es also um "high-performance" geht, d.h. _riessige_ Dateien sollen bearbeitet werden, dann kann die AWK oder gar eine SED-Lösung deutlich schneller sein. -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer ------------------------------------------------------------------------------- Diese EMail ist elektronisch mittels GPG / PGP signiert. Diese elektronische Unterschrift ist in einem EMail-Anhang enthalten. Leider kann die Signatur ohne die Installation entsprechender Programme weder geprüft noch angezeigt werden. Mehr dazu unter: http://www.gnupg.org oder auch http://www.pgpi.org -------------------------------------------------------------------------------
Hallo Michael, Michael Hoeller, 13.12.2005 23:49:
ich muss aus eine sequenziell nummerierten Datei Zeilen löschen, wie kann ich die Nummerierung wiederherstellen. Ich habe mich mit awk versucht, leider erfolglos.
Mit bash (die zu modifizierende Date als Parameter eingeben): ---- cut here ---- #!/bin/bash newfile="$1.renumbered" # Remove a possible existing target file rm "$newfile" 2> /dev/null # Extract the counter status of the first line declare -i count=`sed -n '1,1s/^.\{5\}\(.\{10\}\).*/\1/p' "$1"` while read line ; do echo "$line" | sed "s/\(^.\{5\}\)\(.\{10\}\)\(.*\)/\1`printf "%.10d" "$count"`\3/" >> "$newfile" let count=count+1 done < "$1" ---- cute here ---- Gruß Kimmo
participants (3)
-
Dr. Jürgen Vollmer
-
K. Elo
-
Michael Hoeller