Dato il seguente comando:
echo "1: " | awk '/1/ -F ":" {print $1}'
perché l'output di awk:
1:
Dato il seguente comando:
echo "1: " | awk '/1/ -F ":" {print $1}'
perché l'output di awk:
1:
Risposte:
"-F" è un argomento della riga di comando non sintassi awk, provare:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Se pattern
(principalmente un'istruzione condizionale) è vera , action
viene eseguita. Se pattern
non è disponibile, true
è implicito. Qui pattern
è /1/
che afferma che regex 1
corrisponde al record corrente$0
Se vuoi farlo a livello di codice, puoi usare la FS
variabile:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Nota che se lo cambi nel ciclo principale piuttosto che nel BEGIN
ciclo, ha effetto per la riga successiva letta, poiché la linea corrente è già stata divisa.
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 1
per 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
BEGIN
affermazione sia il più corretto (essendo coerente con la awk
sintassi generale ).
BEGIN
se uso un file per archiviare tutto, mentre -F
è utile con una riga.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
eawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
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
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 ...
Oppure puoi usare:
echo "1: " | awk '/1/{print $1-":"}'
Questa è un'equazione davvero divertente.