2010-04-09 12 views

risposta

239

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

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

La domanda dell'ignorante 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

+0

@rantsh esattamente – rightfold

12

-F è un argomento a awk stesso:

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

Non c'è bisogno di citare due punti. – ceving

46

Se volete farlo programatically, è possibile utilizzare la variabile FS:

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

Si noti che se si modifica nel ciclo principale piuttosto che il ciclo BEGIN, ci vuole influenzare la prossimo riga letta, poiché la riga corrente è già stata divisa.

1

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 separatore di campo indicato.

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

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

AWK lavora come interprete del testo che va formato da linee per l'intero documento e che va fieldwise per ogni linea 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 all'interno di due parentesi con "FS = ...". Consideriamo ora la risposta di "JUERGEN":

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

Sopra le boundries campo sono fissati dalla ":" quindi abbiamo due Campi $ 1 che è "1" e $ 2, che è la space.After vuoto, arriva il espressione regolare "/ 1 /" che indica al filtro di emettere il primo campo solo quando l'interprete incappa su una riga contenente tale espressione (intendo 1); L'output del comando "echo" è una linea che containes "1" in modo che il filtro possa funzionare ...

Quando si tratta con il seguente esempio:

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

La sintassi è disordinato e la l'interprete ha scelto di ignorare la parte F ":" e passata allo sdoppiatore di campo predefinito che è lo spazio vuoto che emette quindi "1:" come primo campo e non ci sarà un secondo campo!

La risposta di JUERGEN contiene la buona sintassi ...

7

si dispone di più 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 torneranno 1 per un ingresso campione "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 
4

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

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

Oppure si può usare:

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

questo è davvero divertente equazione.

Problemi correlati