Ответ 1
Выражение анализируется как
!(x[$(1)]++)
Итак, изнутри, это:
- взять поле 1 текущей строки ввода,
$(1)
(обратите внимание, что$
является оператором в Awk, в отличие от Perl) - index
x
со значением поля 1; еслиx
является несвязанной переменной, привяжите ее к новому ассоциативному массиву - post-increment
x[$(1)]
; применяется правило, аналогичное тому, которое применяется в C, поэтому значение выражения равно значениюx[$(1)]
до приращения, которое будет равно нулю, еслиx[$(1)]
еще не присвоено значение - отрицает значение предыдущего, что даст истину, когда
x[$(1)]
равно нулю - на самом деле делать приращение, так что
x[$(1)]
получает ненулевое значение. Итак, в следующий разx[$(1)]
для того же значения$(1)
вернет 1.
Это выражение затем оценивается для каждой строки на входе и определяет, должно ли выполняться подразумеваемое действие по умолчанию awk
, которое должно эхо-строки на stdout
.