Come usare “:” come separatore di campo awk?
Domanda
Dato seguente comando:
echo "1: " | awk '/1/ -F ":" {print $1}'
Perché awk uscita:
1:
Soluzione
"- F" è un argomento della riga di comando non awk sintassi, provare:
echo "1: " | awk -F ":" '/1/ {print $1}'
Altri suggerimenti
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 incidere per il Avanti linea di lettura in, dato che la linea attuale è già stata divisa.
Si dispone di più modi per :
insieme come separatore:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Tutti loro 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
-F
è un argomento per awk
stessa:
$echo "1: " | awk -F":" '/1/ {print $1}'
1
Si può anche usare una regex come separatore di campo, la segue stampa "bar", utilizzando una regex per impostare il numero "10" come separatore.
echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'
AWK lavora come interprete di testo che va formato da linee per l'intero documento e che va fieldwise per ogni riga in tal modo $ 1, $ 2 .. $ n sono i riferimenti ai campi di ciascuna linea ($ 1 è il primo campo, $ 2 è il secondo campo e così via ...). È possibile definire un separatore di campo utilizzando l'interruttore "-F" sotto la riga di comando o all'interno di due staffe con "FS = ...". Consideriamo ora la risposta di "JUERGEN":
echo "1: " | awk -F ":" '/1/ {print $1}'
Sopra i confini dei campi vengono impostati da ":" quindi abbiamo due campi di $ 1 che è "1" e $ 2, che è la space.After vuota, viene l'espressione regolare "/ 1 /" che indica il filtro per l'uscita del primo campo solo quando le inciampi interprete su una riga contenente una tale espressione (intendo 1); L'output del comando "echo" è una riga che contiene "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 interprete ha scelto di ignorare la parte F ":" e commuta allo splitter campo predefinito che è lo spazio vuoto in uscita così "1:" come primo campo e non ci sarà un secondo campo
La risposta del JUERGEN contiene la buona sintassi ...
Nessuna necessità di scrivere questo molto. Basta mettere il separatore di campo desiderato con l'opzione -F al comando awk e il numero di colonna che si desidera stampare segregata secondo il vostro separatore di campo menzionato.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
In alternativa si può usare:
echo "1: " | awk '/1/{print $1-":"}'
Questo è davvero divertente equazione.