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;}'