Объясните это дублирующее удаление строки, порядок сохранения, однострочную команду awk

Я узнал действительно удобный способ удаления дубликатов строк, сохраняющих порядок от http://goo.gl/sE9yf. скажем, если у вас есть следующий файл,

$cat file
a
a
b
b
a
c

вы можете использовать следующие, чтобы удалить повторяющиеся строки

$awk '!x[$1]++' file
a
b
c

Можете ли вы объяснить, как это работает с точки зрения приоритета операций?

Ответы

Ответ 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.

Ответ 2

В awk-массивах ассоциативны, поэтому первое столбец или первое поле каждой строки $1 используется как индекс для массива x.