Risposte:
Un awk
programma è una serie di coppie condizione-azione, le condizioni sono al di fuori delle parentesi graffe e le azioni racchiuse in esse. Una condizione è considerata falsa se viene valutata zero o la stringa vuota, qualsiasi altra cosa è vera (le variabili non inizializzate sono zero o stringa vuota, a seconda del contesto, quindi sono false). Si può implicare una condizione o un'azione; le parentesi graffe senza una condizione (come inizia la tua) sono considerate avere una condizione vera e vengono sempre eseguite se colpite, e qualsiasi condizione senza azione stamperà la linea se e solo se la condizione è soddisfatta.
Alla 1
fine dello script è 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 molto questi tipi di scorciatoie perché offusca e fuorvia il modo in cui viene analizzato. Quando leggi qualcosa del genere awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
, potresti pensare che 1
sta modificando la precedente dichiarazione. Oppure potresti pensare che 1
sia un alias per {print}
, che non è tecnicamente corretto.
In realtà, 1
è una dichiarazione completamente separata. È possibile separare le dichiarazioni in questo modo:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'
Ogni formato di istruzione awk è condition {action}
. Se non viene {action}
specificato, l'azione predefinita è {print}
. (Se non viene condition
specificato, la condizione predefinita è true
.)
Quindi qui 1
c'è la condizione, che valuta sempre true
poiché è diversa da zero. La action
viene omesso, in modo predefinito {print}
viene eseguita. Puoi pensarlo in questo modo:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
awk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'