Come usare “:” come separatore di campo awk?


243

Dato il seguente comando:

echo "1: " | awk '/1/ -F ":" {print $1}'

perché l'output di awk:

1: 

Risposte:


382

"-F" è un argomento della riga di comando non sintassi awk, provare:

 echo "1: " | awk -F  ":" '/1/ {print $1}'

42
La domanda di Ignorant qui: la / 1 / parte è dire a awk di elaborare solo le righe (o i record per essere più precisi) che contengono il numero 1 giusto?
rantsh,

3
Sembra la sintassi di @rantsh Awk (pattern){action}. Se pattern(principalmente un'istruzione condizionale) è vera , actionviene eseguita. Se patternnon è disponibile, trueè implicito. Qui patternè /1/che afferma che regex 1corrisponde al record corrente$0
kvantour il

62

Se vuoi farlo a livello di codice, puoi usare la FSvariabile:

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

Nota che se lo cambi nel ciclo principale piuttosto che nel BEGINciclo, ha effetto per la riga successiva letta, poiché la linea corrente è già stata divisa.


35

Esistono diversi modi per impostare :come separatore:

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

Tutti sono equivalenti e per un ritorno 1per un input di esempio "1: 2: 3":

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1

qual è il modo preferito? suppongo che l'esempio finale con l' BEGINaffermazione sia il più corretto (essendo coerente con la awksintassi generale ).

1
@randomware stanno tutti bene. Tendo a usarlo BEGINse uso un file per archiviare tutto, mentre -Fè utile con una riga.
fedorqui "SO smettere di danneggiare"

1
Va detto che ci sono sottili differenze tra il terzo caso e tutti gli altri. Esempio: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileeawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
kvantour il


12

-Fè un argomento a awkse stesso:

$echo "1: " | awk -F":" '/1/ {print $1}'
1

2
Non c'è bisogno di citare i due punti.
spasso il

6

Puoi anche usare un regex come separatore di campo, il seguente stamperà una "barra" usando un regex per impostare il numero "10" come separatore.

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

4

Non c'è bisogno di scrivere così tanto. Basta inserire il separatore di campo desiderato con l'opzione -F nel comando awk e il numero di colonna che si desidera stampare segregato secondo il proprio separatore di campo menzionato.

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

4

AWK funziona come interprete di testo che procede in senso lineare per l'intero documento e che procede in senso campo per ogni riga, quindi $ 1, $ 2 .. $ n sono riferimenti ai campi di ogni riga ($ 1 è il primo campo, $ 2 è il secondo campo e così via ...). È possibile definire un separatore di campo utilizzando l'opzione "-F" sotto la riga di comando o tra due parentesi con "FS = ...". Ora considera la risposta di "JUERGEN":

echo "1: " | awk -F  ":" '/1/ {print $1}'

Sopra i limiti del campo sono impostati da ":", quindi abbiamo due campi $ 1 che è "1" e $ 2 che è lo spazio vuoto. Successivamente, arriva l'espressione regolare "/ 1 /" che indica al filtro di produrre solo il primo campo quando l'interprete si imbatte in una riga contenente tale espressione (intendo 1); L'output del comando "echo" è una riga che contiene "1", quindi il filtro funzionerà ...

Quando si tratta del seguente esempio:

echo "1: " | awk '/1/ -F ":" {print $1}'

La sintassi è disordinata e l' interprete ha scelto di ignorare la parte F ":" e passa allo splitter di campo predefinito che è lo spazio vuoto, producendo così "1:" come primo campo e non ci sarà un secondo campo!

La risposta di JUERGEN contiene la buona sintassi ...


3

Oppure puoi usare:

echo "1: " | awk  '/1/{print $1-":"}' 

Questa è un'equazione davvero divertente.


1
cosa /1/significa?

Trova uno schema. In questo caso "1"
José Dias,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.