awk program je řada párů podmínka-akce, přičemž podmínky jsou mimo složené závorky a akce jsou v nich uzavřeny. Podmínka je považována za nepravdivou, pokud se vyhodnotí jako nula nebo prázdný řetězec, cokoliv jiného je pravda (neinicializované proměnné jsou nula nebo prázdný řetězec, v závislosti na kontextu, takže jsou nepravdivé). Může být implikována podmínka nebo akce; složené závorky bez podmínky (jak začíná ta vaše) jsou považovány za mající pravdivou podmínku a jsou vždy provedeny, pokud jsou splněny, a jakákoli podmínka bez akce vytiskne řádek pouze tehdy, pokud je podmínka splněna.
1 na konci vašeho skriptu je podmínka (vždy pravdivá) bez akce, takže provede výchozí akci pro každý řádek a vytiskne řádek (který mohl být změněn předchozí akcí ve složených závorkách).
Opravdu nemám rád tyto typy zkratek, protože zatemňují a zavádějí, jak jsou analyzovány. Když čtete něco jako awk -F"=" '{OFS="=";gsub(",",";",$2)}1' , můžete si myslet, že 1 upravuje předchozí prohlášení. Nebo si můžete myslet 1 je alias pro {print} , což není technicky správné.
Ve skutečnosti 1 je zcela samostatný výrok. Výroky můžete oddělit takto:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'
Formát každého příkazu awk je condition {action} . Pokud neexistuje {action} zadaná, pak je výchozí akce {print} . (Pokud neexistuje condition daná, pak výchozí podmínka je true .)
Takže tady, 1 je podmínka, která se vždy vyhodnotí jako true protože je nenulová. action je vynechán, takže výchozí {print} se provádí. Můžete si to představit takto:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
1 znamená vytisknout každý řádek.
Příkaz awk je stejný jako zápis:
awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'