qual è il significato di 1 alla fine dello script awk


19

Stavo leggendo questo fantastico script

awk -F"=" '{OFS="=";gsub(",",";",$2)}1'

Voglio sapere qual è la funzione 1alla fine di esso


Potresti anche fareawk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'
GypsyCosmonaut il

Risposte:


24

Un awkprogramma è 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 1fine 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).


7

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 1sta modificando la precedente dichiarazione. Oppure potresti pensare che 1sia 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 conditionspecificato, la condizione predefinita è true.)

Quindi qui 1c'è la condizione, che valuta sempre truepoiché è diversa da zero. La actionviene omesso, in modo predefinito {print}viene eseguita. Puoi pensarlo in questo modo:

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'

5

1 significa stampare ogni riga.

L'affermazione awk è la stessa della scrittura:

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.