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.

134voto

Marcin Punkte 3302

...oder eine einfachere Lösung: cut -f 3- INPUTFILE Fügen Sie einfach das richtige Trennzeichen (-d) hinzu und Sie haben den gleichen Effekt.

10 Stimmen

Beachten Sie, dass dies nur funktioniert, wenn das Trennzeichen zwischen allen Spalten genau gleich ist... Zum Beispiel können Sie cut nicht mit einem Begrenzungszeichen wie \d +. (Von denen ich weiß.)

83 Stimmen

Wenn die Frage mit awk betitelt ist, ist es unangebracht, andere Antworten als awk zu akzeptieren. Was ist, wenn die Leute es für awk-Skripte brauchen? Diese Antwort hätte nur ein Kommentar sein sollen.

30 Stimmen

@SyaZ: Normalerweise würde ich zustimmen, aber bei der Menge an "grundlosem awk" in diesem Forum dachte ich, dass es notwendig ist, einen alternativen Weg zu zeigen, um die Aufgabe zu erledigen. Wären Sie nicht dankbar, wenn Ihnen jemand einen einfacheren und schnelleren Weg zeigen würde, die gleiche Aufgabe zu erledigen? Vielleicht dachte der Poster, dass awk der einzige Weg ist, um dies zu tun, weil es eine Reihe von "nicht falschen, aber sicherlich verbesserungswürdigen" Antworten auf andere Fragen gab?

130voto

Jonathan Feinberg Punkte 43293
awk '{for(i=3;i<=NF;++i)print $i}'

4 Stimmen

Awk '{for(i=3;i<=NF;++i)print $i}' kompakter sein :)

1 Stimmen

Danke, lh3. Ich habe nur kopiert und eingefügt für die gawk Handbuch :)

0 Stimmen

Ich denke, Sie können wie folgt vorgehen awk 'NF >= 3'

129voto

daisaa Punkte 1219

29 Stimmen

Ich bin zwar etwas spät dran, aber das funktioniert nicht bei Datensätzen, bei denen das erste oder zweite Feld gleich dem dritten ist (z. B. 3 2 3 4 5)

0 Stimmen

Das Drucken eines internen Bereichs ist auch möglich: ``` # von $3 (eingeschlossen) bis $6 (ausgeschlossen); echo "1,2,3,4,5,6,7,8,9" | awk 'BEGIN{FS=",";OFS=","}{ print substr($0, index($0,$3), length($0)-index($0,$6)-1) }'; # ergibt 3,4,5```

39voto

Dennis Williamson Punkte 322329

Jonathan Feinberg druckt jedes Feld in einer eigenen Zeile aus. Sie könnten verwenden printf um den Datensatz für die Ausgabe in derselben Zeile neu zu erstellen, aber Sie können die Felder auch einfach um einen Sprung nach links verschieben.

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

2 Stimmen

Seien Sie sich bewusst, dass dies nur für Gnu awk funktioniert, indem Sie die NF ist nach POSIX nicht erlaubt.

2 Stimmen

@kvantour: Es funktioniert in gawk, mawk, MacOS awk (nawk?). POSIX scheint zu schweigen, ob NF kann dekrementiert werden.

0 Stimmen

Es ist eine dieser lustigen dunkle Ecken von awk .

24voto

ghostdog74 Punkte 305138
awk '{$1=$2=$3=""}1' file

NB: Bei dieser Methode bleiben in den Feldern 1,2,3 "Leerstellen", aber das ist kein Problem, wenn Sie nur die Ausgabe betrachten wollen.

0 Stimmen

Folgen Sie diesem Befehl mit ` | sed s/^\ *// | column -t`, um führende Leerzeichen zu entfernen und die verbleibenden Spalten auszurichten

2 Stimmen

Was bedeutet die letzte 1 mit welchem Stichwort soll ich suchen? awk ?

0 Stimmen

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