Как я офигел и полюбил AWK.
AWK - сильно недооценен. Мало кто его использует кроме как - вывести вторую колонку.А между тем - это полноценный язык программирования.
Я решил выучить
AWK, когда на хабре увидел конструкцию:awk '!a[$0]++' ./file
Эта конструкция убирает дубли строк файла, оставляя только уникальные.
Причем делает это за один проход чтения файла!
Работает она очень просто:
Считывается строка файла ($0), Если a[$0] не (!) равен 0, то строка выводится в stdout.
После этого, a[$0] инкрементируется. Если далее встретится такое же значение строки $0, то a[$0] уже будет ненулевым и строка проигнорируется.
У этой конструкции есть и подводные камни. Весь файл фактически считывается в массив и хранится в памяти. Так что если файл больше половины свободной памяти - используйте
uniq.И теперь несколько примеров без объяснений:
awk '++a[$0]==3'
Уникальные строки, c числом вхождений >=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.
👉 Вопросы, комментарии приветствуются.
tags: #linux
—
🔔 @bashdays