Un awk
programma è una serie di coppie condizione-azione, le condizioni sono al di fuori delle parentesi graffe e le azioni sono racchiuse in esse. Una condizione è considerata falsa se restituisce zero o la stringa vuota, qualsiasi altra cosa è vera (le variabili non inizializzate sono zero o stringhe vuote, a seconda del contesto, quindi sono false). Può essere implicita una condizione o un'azione; le parentesi graffe senza una condizione (all'inizio della tua) sono considerate avere una condizione vera e vengono sempre eseguite se vengono colpite, e qualsiasi condizione senza un'azione stamperà la riga se e solo se la condizione è soddisfatta.
Il 1
alla fine del tuo script c'è una condizione (sempre vera) senza azione, quindi esegue l'azione predefinita per ogni riga, stampando la riga (che potrebbe essere stata modificata dall'azione precedente tra parentesi graffe).
Non mi piacciono davvero questi tipi di scorciatoie perché offusca e fuorvia il modo in cui viene analizzato. Quando leggi qualcosa come awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
, potresti pensare che il 1
sta modificando la dichiarazione precedente. Oppure potresti pensare a 1
è un alias per {print}
, che non è tecnicamente corretto.
In realtà, 1
è una dichiarazione completamente separata. Puoi separare le istruzioni in questo modo:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'
Ogni formato dell'istruzione awk è condition {action}
. Se non c'è {action}
data, l'azione predefinita è {print}
. (Se non c'è condition
data, la condizione predefinita è true
.)
Quindi qui, 1
è la condizione, che restituisce sempre true
poiché è diverso da zero. Il action
viene omesso, quindi il valore predefinito {print}
viene eseguita. Puoi pensarla in questo modo:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
1
significa stampare ogni riga.
L'istruzione awk equivale a scrivere:
awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'