Dato seguente comando:Come utilizzare ":" come separatore di campo awk?
echo "1: " | awk '/1/ -F ":" {print $1}'
Perché awk uscita:
1:
Dato seguente comando:Come utilizzare ":" come separatore di campo awk?
echo "1: " | awk '/1/ -F ":" {print $1}'
Perché awk uscita:
1:
"-F" è un argomento della riga di comando non sintassi awk, provare:
echo "1: " | awk -F ":" '/1/ {print $1}'
-F
è un argomento a awk
stesso:
$echo "1: " | awk -F":" '/1/ {print $1}'
1
Non c'è bisogno di citare due punti. – ceving
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.
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
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 ...
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
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}'
Oppure si può usare:
echo "1: " | awk '/1/{print $1-":"}'
questo è davvero divertente equazione.
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
@rantsh esattamente – rightfold