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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top