что означает 1 в конце скрипта awk

19

Я читал этот сценарий awk

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

Я хочу знать, какова функция 1в конце этого

Мираж
источник
Вы также можете сделатьawk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'
GypsyCosmonaut

Ответы:

24

awkПрограмма представляет собой серию пар условие действия, условия , являющиеся вне фигурных скобок и действий , будучи вложенными в них. Условие считается ложным, если оно оценивается как ноль или пустая строка, а все остальное - истина (неинициализированные переменные - это ноль или пустая строка, в зависимости от контекста, поэтому они являются ложными). Может подразумеваться условие или действие; Скобки без условия (как начинается твое) считаются имеющими истинное условие и всегда выполняются при попадании в них, и любое условие без действия будет печатать строку тогда и только тогда, когда условие выполнено.

В 1конце вашего скрипта есть условие (всегда истинное) без действия, поэтому он выполняет действие по умолчанию для каждой строки, печатая строку (которая могла быть изменена предыдущим действием в фигурных скобках).

Kevin
источник
7

Мне действительно не нравятся эти типы ярлыков, потому что они запутывают и вводят в заблуждение, как они анализируются. Когда вы читаете что-то вроде этого awk -F"=" '{OFS="=";gsub(",",";",$2)}1', вы можете подумать, что 1это модифицирует предыдущий оператор. Или вы можете подумать, что 1это псевдоним для {print}, что не является технически правильным.

Вообще-то, 1это совершенно отдельное утверждение. Вы можете отделить утверждения следующим образом:

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

Каждый формат оператора AWK является condition {action}. Если ничего не {action}дано, то действием по умолчанию является {print}. (Если нет conditionданных, то по умолчанию используется условие true.)

Итак, вот 1условие, которое всегда оценивается, trueпоскольку оно ненулевое. Параметр actionопущен, поэтому выполняется по умолчанию {print}. Вы можете думать об этом так:

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
wisbucky
источник
5

1 означает печатать каждую строку.

Утверждение awk аналогично написанию:

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
Гуру
источник