co oznacza 1 na końcu skryptu awk

19

Czytałem ten skrypt awk

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

Chcę wiedzieć, jaka jest funkcja 1na końcu

Miraż
źródło
Można również zrobićawk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'
GypsyCosmonaut

Odpowiedzi:

24

awkProgram to seria par stan-akcja, warunki będące poza klamrami i działań zamknąć w nich. Warunek jest uważany za fałszywy, jeśli jego wartość wynosi zero lub pusty ciąg, wszystko inne jest prawdziwe (niezainicjowane zmienne to zero lub pusty ciąg, w zależności od kontekstu, więc są one fałszywe). Można założyć albo warunek, albo działanie; nawiasy klamrowe bez warunku (jak zaczyna się Twój) są uważane za mające prawdziwy warunek i są zawsze wykonywane, jeśli zostaną trafione, a każdy warunek bez akcji wypisze linię, jeśli tylko warunek zostanie spełniony.

1Na końcu skryptu jest warunek (zawsze prawdziwe), bez działania, więc wykonuje domyślną akcję dla każdej linii, drukowanie linii (które mogły zostać zmodyfikowane przez poprzedniego działania w szelki).

Kevin
źródło
7

Naprawdę nie lubię tego typu skrótów, ponieważ zaciemniają i wprowadzają w błąd w jaki sposób są analizowane. Kiedy czytasz coś podobnego awk -F"=" '{OFS="=";gsub(",",";",$2)}1', możesz pomyśleć, że 1to modyfikuje poprzednie zdanie. Lub może się wydawać, że 1jest to alias {print}, co nie jest technicznie poprawne.

W rzeczywistości 1jest to całkowicie osobne stwierdzenie. Możesz rozdzielić takie instrukcje:

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

Każdy format instrukcji awk to condition {action}. Jeśli nie {action}podano, domyślną akcją jest {print}. (Jeśli nie conditionpodano, to domyślnym warunkiem jest true.)

Więc tutaj 1jest warunek, który zawsze ocenia się, trueponieważ jest niezerowy. actionZostanie pominięty, więc domyślny {print}jest wykonywana. Możesz myśleć o tym w ten sposób:

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
wisbucky
źródło
5

1 oznacza wydrukowanie każdej linii.

Instrukcja awk jest taka sama jak pisanie:

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
Guru
źródło