Tagd Tagd порадовал нас ещё одним постом. Спасибо, друг! В редакцию тебя, что ли, на ставку забрать, складно пишешь. Пиши ещё!

Как я офигел и полюбил AWK.

AWK сильно недооценён. Мало кто его использует, кроме как вывести вторую колонку.

А между тем это полноценный язык программирования.

Я решил выучить AWK, когда на Хабре увидел конструкцию:

awk '!a[$0]++' ./file

Эта конструкция убирает дубли строк файла, оставляя только уникальные.

Причём делает это за один проход чтения файла!

Работает она очень просто:

Считывается строка файла ($0). Если a[$0] не (!) равен 0, то строка выводится в stdout.

После этого a[$0] инкрементируется. Если далее встретится такое же значение строки $0, то a[$0] уже будет ненулевым и строка проигнорируется.

Tagd Tagd
Tagd Tagd
Bash Master
Задать вопрос
У этой конструкции есть и подводные камни. Весь файл фактически считывается в массив и хранится в памяти. Так что если файл больше половины свободной памяти — используйте uniq.

И теперь несколько примеров без объяснений:

awk '++a[$0]==3'

Уникальные строки с числом вхождений >=3.

awk '++a[$0]>=3'

Все вхождения, начиная с третьего.

Эти конструкции могут быть полезны, когда хочется выявить особо настырных.

Ну и ещё. AWK поддерживает вещественные числа. Поэтому, когда нужно что-то посчитать:

awk 'BEGIN{print 1/3}'

или

echo 1 3 | awk '{print $1/$2}'

Не так красиво, как bc. Но bc/dc может и не быть в системе, а awk есть практически везде.

В общем, если припрёт, awk можно заменить cat, sed, grep, tr, cut, head, tail, wc

Ну и ложка дёгтя. Есть несколько версий awk: MAWK, NAWK, GAWK.

Базовый функционал у них одинаковый. Так что не заморачивайтесь. Если кто-то заинтересовался — help по GAWK.

Вопросы, комментарии приветствуются.