Ich habe hier ein Problem. Ich muss eine Spalte in einer Textdatei mit awk drucken. Die Spalten werden jedoch überhaupt nicht durch Leerzeichen getrennt, sondern nur durch ein einziges Komma. Sieht ungefähr so aus:
column1,column2,column3,column4,column5,column6
Wie würde ich die dritte Spalte mit awk ausdrucken?
awk
? IMHO ist dies ein sehr einfaches Problem. Haben Sie einen Versuch, es zu lösen?Antworten:
Versuchen:
awk -F',' '{print $3}' myfile.txt
Hier in -F sagst du zu awk, dass "," als Feldtrennzeichen verwendet wird.
quelle
Wenn Sie nur das dritte Feld jeder Zeile drucken müssen, wobei jedes Feld durch ein Komma getrennt ist, können Sie cut verwenden:
cut -d, -f3 file
-d,
Setzt das Trennzeichen auf ein Komma-f3
Gibt an, dass nur das dritte Feld gedruckt werden sollquelle
awk
kommt sehr praktisch, wenn ich sagen möchte, ich möchte[col1]:[col5]
mit verschiedenenVersuche dies
awk
awk -F, '{$0=$3}1' file column3
,
Felder teilen durch,
$0=$3
Setzen Sie die Zeile auf Nur Feld3
1
Alles ausdrucken. ( hier erklärt )Dies könnte auch verwendet werden:
awk -F, '{print $3}' file
quelle
cut -d, -f3 file
ist so kryptisch wie dieses, wenn jemand nicht vertraut istcut
. ;)cut --help
alles erklärt wird, was Sie wissen müssen, währendawk --help
dies nicht der Fall ist . Vielleicht hätte ich mich entscheiden sollencut --delimiter=, --fields=3 file
, obwohl ich meine Zweifel habe, dass die längeren Schalter tragbar sind :)Eine einfache, obwohl awk-lose Lösung in Bash::
while IFS=, read -r a a a b; do echo "$a"; done <inputfile
Es funktioniert dann schneller für kleine Dateien (<100 Zeilen) awkda es weniger Ressourcen verbraucht (vermeidet das Aufrufen der teuren
fork
undexecve
Systemaufrufe).EDIT von Ed Morton (Entschuldigung für die Antwort, ich weiß nicht, ob es einen besseren Weg gibt, dies zu beheben):
Um den Mythos auszuräumen, dass die Shell für kleine Dateien schneller als awk ausgeführt wird:
$ wc -l file 99 file $ time while IFS=, read -r a a a b; do echo "$a"; done <file >/dev/null real 0m0.016s user 0m0.000s sys 0m0.015s $ time awk -F, '{print $3}' file >/dev/null real 0m0.016s user 0m0.000s sys 0m0.015s
Ich gehe davon aus, dass das Shell-Skript in einem Bruchteil eines Augenblicks schneller ausgeführt wird als das awk-Skript, wenn Sie eine WIRKLICH kleinste Datei erhalten. Aber wen interessiert das?
Und wenn Sie nicht glauben, dass es schwieriger ist, robuste Shell-Skripte als awk-Skripte zu schreiben, sehen Sie sich diesen Fehler in dem von Ihnen veröffentlichten Shell-Skript an:
$ cat file a,b,-e,d $ cut -d, -f3 file -e $ awk -F, '{print $3}' file -e $ while IFS=, read -r a a a b; do echo "$a"; done <file $
quelle
While read
Schleifen sind deutlich langsamer als awk, selbst wenn sie mit winzigen Dateien schneller wären, wäre der Geschwindigkeitsunterschied vernachlässigbar.echo
damit nicht einfach gelöst werden kann. In diesem Fall kann man das verwendenprintf "%s\n" "$a"
, um das loszuwerden. Dies ist auch ein Bash - Einbau .