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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top