2008-10-17 17 views
6

Ich habe eine Datei mit Feldern, die durch Pipe-Zeichen getrennt sind, und ich möchte nur das zweite Feld drucken. Dieser Versuch schlägt fehl:Wie drucke ich ein Feld aus einer durch Pipes getrennten Datei?

$ 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?

Antwort

9

Der entscheidende Punkt hier ist, dass das Pipe-Zeichen (|) in die Shell maskiert werden muss. Verwenden Sie "\|" oder "'|'", um es vor Shell-Interpertation zu schützen, und lassen Sie es in der Befehlszeile an awk übergeben.


die Kommentare lesen Ich sehe, dass das ursprüngliche Plakat, das eine vereinfachte Version des ursprünglichen Problems stellt die Filterung beteiligt file vor der Auswahl und die Felder zu drucken. Ein Durchlauf durch grep wurde verwendet und das Ergebnis piped in awk für die Feldauswahl. Das erklärt die völlig unnötige cat file, die in der Frage erscheint (es ersetzt die grep <pattern> file).

Gut, das wird funktionieren. Awk ist jedoch größtenteils selbst ein Mustervergleichswerkzeug und kann vertraut sein, um die übereinstimmenden Zeilen zu finden und zu bearbeiten, ohne dass grep aufgerufen werden muss. 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 verloren aussehende {next;} ist eine Standardaktion, die auf die nächste Zeile in der Eingabe springt. Es scheint nicht notwendig zu sein, aber ich habe diese Gewohnheit von vor langer Zeit ...

3

Das Pipe-Zeichen muss maskiert werden, damit die Shell es nicht interpretiert. Eine einfache Lösung:

$ awk -F\| '{print $2}' file 

Eine andere Wahl wäre, um den Charakter zu zitieren:

$ awk -F'|' '{print $2}' file 
16

Oder nur ein Befehl:

cut -d '|' -f FIELDNUMBER 
+0

Beachten Sie, dass der Kern des Problems ist die Pipe-Zeichen, nicht den Befehl verwendet. Aber das ist eine feine Lösung. –

+0

Ich dachte darüber nach, aber ich hätte lieber eine Antwort, die das Problem erklärt. Das ist eigentlich der Punkt meines Kommentars. ;-) –

+0

Würde 'cut -d '|' -f FIELDNUMBER DATEINAME – Andrea

0

Und 'Datei' keine Rohr Symbole enthält, so Es druckt nichts. Sie sollten entweder 'cat file' verwenden oder einfach die Datei nach dem awk-Programm auflisten.

+0

Urg. Das tut mir leid. Der ursprüngliche Code grep'te eine Datei und piped dann die Ausgabe an awk. Ich reinigte das Kommando, teste es aber nicht. :( –