Folgendes ist der Perl-Befehl meines Kollegen?
{perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename;}
Er sagte, dies diene dazu, Leerzeilen zu entfernen und die ersten fünf Felder auf eine Zahl zu prüfen.
Dank im Voraus.
Antwort1
Die Felder werden also durch ein Tilde-Zeichen getrennt? Interessant ist das Trennzeichen zwischen den Zeilen. Es wird ein sein, \n
aber kein Zeilenumbruch.
Also zur Erklärung:
Der s/^/\\n/
Befehl ersetzt die Zeile mit „start with“, \n
jedoch nur, wenn die folgenden Bedingungen if
beide erfüllt sind:
- Die Zeilennummer muss größer als 1 sein (
$.>1
) - Die Zeile muss mindestens 5 durch Tilde-Zeichen getrennte Zahlen enthalten.
-l
Anschließend werden alle Zeilen (außer leere Zeilen (werden per Parameter vermieden ) ausgedruckt ( printf "%s", $_
). Der Code garantiert nicht, dass die ersten 5 Felder eine Zahl enthalten!
user@pc:/tmp$ cat inputfile.txt
1~2~3~4~5
6~7~8~9~0
1~2~3~4~5
1~2~3~4
b~2~3
user@pc:/tmp$ perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename
1~2~3~4~5\n6~7~8~9~0\n1~2~3~4~51~2~3~4b~2~3user@pc:/tmp$
Ich bin mir nicht sicher, was die geschweiften Klammern um den Befehl angeht. Vielleicht möchten Sie ihn von woanders aus aufrufen. Eine andere (vielleicht kürzere) Version, die die Existenz von 5 Feldern mit Zahlen garantiert, ist:
user@pc:/tmp$ perl -ne 'next unless (/^\d+~\d+~\d+~\d+~\d+/); print $_;' inputfile.txt
1~2~3~4~5
6~7~8~9~0
1~2~3~4~5
user@pc:/tmp$
Es werden alle Zeilen übersprungen, die nicht mit diesen fünf Feldern beginnen, und daher auch leere Zeilen.