Come si stampa un campo da un file separato da pipe?
Domanda
Ho un file con campi separati da caratteri pipe e voglio stampare solo il secondo campo. Questo tentativo fallisce:
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
C'è un modo per farlo?
Soluzione
Il punto chiave qui è che il carattere pipe (|
) deve essere evaso dalla shell. Usa & Quot; \|
& Quot; oppure " '|'
" per proteggerlo dall'interferenza della shell e consentirne il passaggio a awk
dalla riga di comando.
Leggendo i commenti vedo che il poster originale presenta una versione semplificata del problema originale che comportava il filtraggio file
prima di selezionare e stampare i campi. È stato utilizzato un passaggio grep
e il risultato è stato reindirizzato in awk per la selezione del campo. Ciò spiega il superfluo cat file
che appare nella domanda (sostituisce il grep <pattern> file
).
Bene, funzionerà. Tuttavia, awk è in gran parte uno strumento di corrispondenza dei modelli e può essere considerato affidabile per trovare e lavorare sulle linee di corrispondenza senza la necessità di invocare /<pattern>/
. Usa qualcosa come:
awk -F\| '/<pattern>/{print $2;}{next;}' file
Il <pattern>
bit indica a {next;}
di eseguire l'azione che segue sulle linee che corrispondono a <=>.
L'aspetto perduto <=> è un'azione predefinita che salta alla riga successiva nell'input. Non sembra essere necessario, ma ho questa abitudine da molto tempo fa ...
Altri suggerimenti
O semplicemente usa un comando:
cut -d '|' -f FIELDNUMBER
Il carattere pipe deve essere evitato in modo che la shell non lo interpreti. Una soluzione semplice:
$ awk -F\| '{print $2}' file
Un'altra scelta sarebbe quella di citare il personaggio:
$ awk -F'|' '{print $2}' file
E 'file' non contiene simboli di pipe, quindi non stampa nulla. Dovresti usare 'file cat' o semplicemente elencare il file dopo il programma awk.