8 Stimmen

Awk: Drucken einer unbestimmten Anzahl von Spalten

Ich habe eine Datei, die mehrere durch Tabulatoren getrennte Felder enthält. Ich versuche, alle Spalten außer der ersten auszudrucken, möchte sie jedoch alle nur in einer Spalte mit AWK ausdrucken. Das Format der Datei ist

col 1   col 2   ... col n

Es gibt mindestens 2 Spalten in einer Zeile.

Beispiel

2012029754      901749095
2012028240      901744459       258789
2012024782      901735922
2012026032      901738573       257784
2012027260      901742004
2003062290      901738925       257813  257822
2012026806      901741040
2012024252      901733947       257493
2012024365      901733700
2012030848      901751693       260720  260956  264843  264844

Also möchte ich awk sagen, dass es Spalte 2 bis Spalte n für n größer als 2 drucken soll, ohne Leerzeilen zu drucken, wenn in dieser Zeile keine Informationen in Spalte n vorhanden sind, alles in einer Spalte wie folgt.

901749095
901744459
258789
901735922
901738573
257784
901742004
901738925
257813
257822
901741040
901733947
257493
901733700
901751693
260720
260956
264843
264844

Das ist das erste Mal, dass ich awk benutze, also hab Geduld mit mir. Ich habe dies von der Befehlszeile aus geschrieben, was funktioniert:

awk '{i=2; 
while ($i ~ /[0-9]+/)
{ 
    printf "%s\n", $i
    i++
}
}' bth.data

Es handelt sich mehr um eine Genehmigungssuche als um eine Frage, ob dies der richtige Weg ist, so etwas in AWK zu tun, oder ob es einen besseren/kürzeren Weg gibt.

Beachte, dass die tatsächliche Eingabedatei Millionen von Zeilen enthalten könnte.

Danke

12voto

Levon Punkte 134187

Ist das das, was du als Ausgabe haben möchtest?

awk '{for(i=2; i<=NF; i++) print $i}' bth.data

ergibt

901749095
901744459
258789
901735922
901738573
257784
901742004
901738925
257813
257822
901741040
901733947
257493
901733700
901751693
260720
260956
264843
264844

NF ist eine von mehreren vordefinierten awk-Variablen. Es gibt die Anzahl der Felder in einer bestimmten Eingabezeile an. Zum Beispiel ist es nützlich, wenn du immer das letzte Feld in einer Zeile ausgeben möchtest print $NF. Oder natürlich, wenn du alle oder einen Teil der Felder in einer gegebenen Zeile bis zum Ende der Zeile durchlaufen möchtest.

4voto

William Pursell Punkte 188248

Scheint so, als wäre awk das falsche Werkzeug. Ich würde folgendes tun:

cut -f 2- < bth.data | tr -s '\t' '\n'

Beachten Sie, dass mit -s das Drucken von Leerzeilen vermieden wird, wie im ursprünglichen Problem angegeben.

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