Tagd Tagd порадовал нас ещё одним постом. Спасибо, друг! В редакцию тебя, что ли, на ставку забрать, складно пишешь. Пиши ещё!
Как я офигел и полюбил AWK.
AWK сильно недооценён. Мало кто его использует, кроме как вывести вторую колонку.
А между тем это полноценный язык программирования.
Я решил выучить AWK, когда на Хабре увидел конструкцию:
awk '!a[$0]++' ./file
Эта конструкция убирает дубли строк файла, оставляя только уникальные.
Причём делает это за один проход чтения файла!
Работает она очень просто:
Считывается строка файла ($0). Если a[$0] не (!) равен 0, то строка выводится в stdout.
После этого a[$0] инкрементируется. Если далее встретится такое же значение строки $0, то a[$0] уже будет ненулевым и строка проигнорируется.
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.
Вопросы, комментарии приветствуются.








Комментарии