Ответы:
awk
Программа представляет собой серию пар условие действия, условия , являющиеся вне фигурных скобок и действий , будучи вложенными в них. Условие считается ложным, если оно оценивается как ноль или пустая строка, а все остальное - истина (неинициализированные переменные - это ноль или пустая строка, в зависимости от контекста, поэтому они являются ложными). Может подразумеваться условие или действие; Скобки без условия (как начинается твое) считаются имеющими истинное условие и всегда выполняются при попадании в них, и любое условие без действия будет печатать строку тогда и только тогда, когда условие выполнено.
В 1
конце вашего скрипта есть условие (всегда истинное) без действия, поэтому он выполняет действие по умолчанию для каждой строки, печатая строку (которая могла быть изменена предыдущим действием в фигурных скобках).
Мне действительно не нравятся эти типы ярлыков, потому что они запутывают и вводят в заблуждение, как они анализируются. Когда вы читаете что-то вроде этого 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}
'
awk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'