150 Stimmen

Wie drucke ich die dritte Spalte in die letzte Spalte?

Ich versuche, die ersten beiden Spalten (an denen ich nicht interessiert bin) aus einer DbgView-Protokolldatei zu entfernen. Ich kann anscheinend kein Beispiel finden, das ab Spalte 3 bis zum Ende der Zeile druckt. Beachten Sie, dass jede Zeile eine variable Anzahl von Spalten hat.

19voto

Brother Punkte 1930

Wenn Sie die Spalten nach der 3. z.B. in der gleichen Zeile drucken wollen, können Sie verwenden:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

Zum Beispiel:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

Es wird gedruckt:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

Wie wir sehen können, wird der Zahlschein sogar mit Leerzeichen in der richtigen Zeile angezeigt.

0 Stimmen

Das ist ausgezeichnet, aber ich habe ein Problem damit, dass $NF ausgeschlossen ist. Wenn ich die Bedingung setze (<=NF), erhalte ich das letzte Feld, aber das erste Zeichen des ersten Feldes wird abgeschnitten. Habe ich etwas in Bezug auf die Funktionalität falsch verstanden?

0 Stimmen

Mein Problem scheint zu sein, dass ^M am Ende der letzten Spalte hängen bleibt. Ich weiß nicht, wie ich es entfernen kann.

9voto

Wawrzek Punkte 472

Was ist mit der folgenden Zeile:

awk '{$1=$2=$3=""; print}' file

Auf der Grundlage des Vorschlags von @ghostdog74. Meine sollte sich besser verhalten, wenn Sie Zeilen filtern, d.h.:

awk '/^exim4-config/ {$1=""; print }' file

1 Stimmen

Kurz und einfach. Könnte auch Rohr & hinzufügen sed 's/\s\+//g' am Ende des Befehls, um führende Leerzeichen abzuschneiden

7voto

Mitchjol Punkte 71
awk '{a=match($0, $3); print substr($0,a)}'

Zunächst ermitteln Sie die Position des Beginns der dritten Spalte. Mit substr drucken Sie die gesamte Zeile ($0) ab der Position (in diesem Fall a) bis zum Ende der Zeile.

5voto

funk Punkte 1881

Der folgende awk-Befehl gibt die letzten N Felder jeder Zeile aus und gibt am Ende der Zeile ein neues Zeilenzeichen aus:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

Nachfolgend finden Sie ein Beispiel, das den Inhalt des Verzeichnisses /usr/bin auflistet und dann die letzten 3 Zeilen festhält und dann die letzten 4 Spalten jeder Zeile mit awk ausgibt:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

4voto

Chris Koknat Punkte 3032

Perl-Lösung:

perl -lane 'splice @F,0,2; print join " ",@F' file

Diese Befehlszeilenoptionen werden verwendet:

  • -n Schleife um jede Zeile der Eingabedatei, nicht automatisch jede Zeile drucken

  • -l entfernt die Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder ein

  • -a Autosplit-Modus - teilt Eingabezeilen in das @F-Array. Standardmäßig wird bei Leerzeichen aufgeteilt

  • -e den Perl-Code ausführen

splice @F,0,2 entfernt sauber die Spalten 0 und 1 aus dem Array @F

join " ",@F fügt die Elemente des Arrays @F zusammen, wobei zwischen den einzelnen Elementen ein Leerzeichen eingefügt wird

Wenn Ihre Eingabedatei nicht durch Leerzeichen, sondern durch Kommata getrennt ist, verwenden Sie -F, -lane


Python-Lösung:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X