Wie drucke ich ein Feld aus einem Rohr-separierte Datei?
Frage
Ich habe eine Datei mit Feldern durch Pipe-Zeichen getrennt, und ich möchte nur das zweite Feld drucken. Dieser Versuch schlägt fehl:
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
Gibt es eine Möglichkeit, dies zu tun?
Lösung
Der entscheidende Punkt hier ist, dass das Pipe-Zeichen (|
) muss an die Schale entwertet werden. Verwenden Sie „\|
“ oder „'|'
“ zum Schutz vor Shell interpertation und lassen Sie es auf der Kommandozeile awk
weitergegeben werden.
die Kommentare liest Ich sehe, dass das ursprüngliche Plakat, das eine vereinfachte Version des ursprünglichen Problems stellt die Filterung file
beteiligt, bevor die Auswahl und die Felder zu drucken. Ein Durchgang durch grep
wurde verwendet, und das Ergebnis in verrohrt awk für die Feldauswahl. Das erklärt den völlig unnötigen cat file
, die in der Frage erscheint (es ersetzt die grep <pattern> file
).
Gut, das funktioniert. Allerdings awk ist weitgehend ein Muster auf seiner eigenen passenden Werkzeug und kann vertraut werden auf die passenden Zeilen zu finden und zu arbeiten, ohne grep
aufrufen zu müssen. Verwenden Sie so etwas wie:
awk -F\| '/<pattern>/{print $2;}{next;}' file
Das /<pattern>/
Bit teilt awk
die Aktion durchzuführen, die auf den Linien folgt, die <pattern>
entsprechen.
Die verlorenen schau {next;}
ist eine Standard-Aktion in der nächsten Zeile in der Eingabe zu überspringen. Es ist nicht notwendig zu sein scheint, aber ich habe diese Gewohnheit von vor langer Zeit ...
Andere Tipps
Oder benutzen Sie einfach einen Befehl:
cut -d '|' -f FIELDNUMBER
Das Pipe-Zeichen muss maskiert werden, so dass die Schale nicht interpretieren sind. Eine einfache Lösung:
$ awk -F\| '{print $2}' file
Eine andere Wahl wäre, um den Charakter zu zitieren:
$ awk -F'|' '{print $2}' file
Und ‚Datei‘ enthält keine Rohr Symbole, so druckt er nichts. Sie sollen entweder ‚cat-Datei‘ verwenden oder einfach die Datei nach dem awk-Programm Liste.