Меняем sort и uniq на awk
Собрал коллекцию приёмов, которые превращают awk в отличную замену sort|uniq в задачах обработки текста.
uniq без sort - мой самый любимый трюк:
awk '!seen[$0]++'
Первое вхождение строки печатается, последующие - нет. А чтобы вывести только дубликаты:
awk '++seen[$0] == 2'
Подсчёт и суммы по группам:
awk '{g[$0]++} END {for (k in g) print g[k], k}' # count
awk '{g[$1] += $2} END {for (k in g) print g[k], k}' # sum
Пересечение двух файлов (ключ - NR==FNR работает только для первого файла):
awk 'NR==FNR {lut[$0]=1; next} $0 in lut {print}' FILE1 FILE2
Разность - заменить условие на !($0 in lut). Объединение - просто cat + uniq.
Важно: условие $0 in lut лучше, чем lut[$0], - последний при промахе создаёт пустые элементы массива и жрёт память на больших файлах.
Производительность:
- LC_ALL=C awk '...' - отключает Unicode, иногда даёт большой буст
- mawk вместо GNU awk - значительно быстрее
Лига Сисадминов
2.7K постов19.2K подписчиков
Правила сообщества
Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.