it-swarm.com.de

Wie kann die dritte Spalte bis zur letzten Spalte gedruckt werden?

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

94
Amit G

... oder eine einfachere Lösung: cut -f 3- INPUTFILE füge einfach das richtige Trennzeichen (-d) hinzu und du hast den gleichen Effekt.

93
Marcin
awk '{for(i=3;i<=NF;++i)print $i}' 
95
89
daisaa

Die Antwort von Jonathan Feinberg druckt jedes Feld in einer separaten Zeile. Sie können printf verwenden, um den Datensatz für die Ausgabe in derselben Zeile wiederherzustellen, Sie können die Felder aber auch einfach um einen Sprung nach links verschieben.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
31
awk '{$1=$2=$3=""}1' file

Hinweis: Diese Methode hinterlässt "Leerstellen" in 1,2,3-Feldern, ist aber kein Problem, wenn Sie nur die Ausgabe betrachten möchten.

16
ghostdog74
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

Dies schneidet das vor dem angegebenen Feld Nr., N, ab und druckt den Rest der Zeile, einschließlich Feld Nr. N und Beibehalten des ursprünglichen Abstands (es wird nicht neu formatiert). Es ist unerheblich, ob die Zeichenfolge des Felds auch an anderer Stelle in der Zeile angezeigt wird. Dies ist das Problem mit der Antwort von daisaa.

Eine Funktion definieren:

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

Und benutze es so:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

Die Ausgabe behält alles bei, einschließlich der Leerzeichen

Funktioniert gut bei Dateien, bei denen '/ n' das Datensatztrennzeichen ist, sodass das Zeichen für die neue Zeile nicht in den Zeilen enthalten ist. Wenn Sie es mit anderen Datensatztrennzeichen verwenden möchten, verwenden Sie Folgendes:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

zum Beispiel. Funktioniert mit fast allen Dateien gut, solange sie keine hexadezimalen Zeichen verwenden. 1 innerhalb der Zeilen.

8
Robert Vila

Wenn Sie die Spalten nach der 3. Zeile beispielsweise in derselben Zeile drucken möchten, können Sie Folgendes 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, zeigt die Gehaltsabrechnung selbst mit Leerzeichen in der richtigen Zeile.

5
Brother

Was ist mit der folgenden Zeile:

awk '{$ 1 = $ 2 = $ 3 = ""; Druckdatei

Basierend auf dem @ ghostdog74-Vorschlag. Meine sollte sich besser verhalten, wenn Sie Zeilen filtern, d. H .:

awk '/ ^ exim4-config/{$ 1 = ""; Druckdatei
5
Wawrzek

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

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

Im Folgenden finden Sie ein Beispiel, in dem der Inhalt des Verzeichnisses/usr/bin aufgelistet ist und die letzten 3 Zeilen enthalten und dann die letzten 4 Spalten jeder Zeile mit awk gedruckt werden:

$ 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
4
funk

Nun, Sie können den gleichen Effekt leicht mit einem regulären Ausdruck erzielen. Angenommen, das Trennzeichen ist ein Leerzeichen, würde es wie folgt aussehen:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
3
Eddie Sullivan

Perl-Lösung:

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

Diese Befehlszeilenoptionen werden verwendet:

  • -n Durchläuft jede Zeile der Eingabedatei und druckt nicht automatisch jede Zeile

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

  • -a Autosplit-Modus - Teilen Sie die Eingabezeilen in das @F-Array. Standardmäßig wird auf Leerzeichen aufgeteilt

  • -e Führe den Perl-Code aus

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

join " ",@F Fügt die Elemente des @F-Arrays mit einem Leerzeichen zwischen den Elementen zusammen

Wenn Ihre Eingabedatei durch Kommas und nicht durch Leerzeichen 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

2
Chris Koknat
awk '{a=match($0, $3); print substr($0,a)}'

Zuerst finden Sie die Position des Anfangs der dritten Spalte. Mit substr drucken Sie die gesamte Zeile ($ 0) von der Position (in diesem Fall a) bis zum Zeilenende. 

2
Mitchjol

In Bash können Sie die folgende Syntax mit Positionsparametern verwenden:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

Weitere Informationen: Umgang mit Positionsparametern bei Bash Hackers Wiki

1
kenorb
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

druckt Datensätze vom vierten bis zum letzten Feld in derselben Reihenfolge wie in der Originaldatei

1
Massimo

Etwas spät hier, aber nichts davon schien zu funktionieren. Versuchen Sie dies, indem Sie mit printf Leerzeichen einfügen. Ich habe mich dafür entschieden, am Ende keinen Zeilenumbruch zu haben.

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
1
Ross
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

Die ersten beiden Spalten werden gelöscht, sed entfernt führende Leerzeichen.

0
sjas

Wenn es nur darum geht, die ersten beiden Felder zu ignorieren, und wenn Sie beim Maskieren dieser Felder kein Leerzeichen wünschen (wie es einige der obigen Antworten tun):

awk '{gsub($1" "$2" ",""); print;}' file
0
champost