Linux awk: как вывести нужный столбец и посчитать сумму
Чтобы вывести столбец, используйте awk '{print $2}' файл: $1 первый столбец, $2 второй, $NF последний, а $0 вся строка. По умолчанию столбцы разделены пробелами или табуляцией, другой разделитель задаётся ключом -F.
Для примеров возьмём файл sales.txt:
Анна Москва 120
Борис Казань 80
Вера Москва 200
Глеб Сочи 50Вывести столбцы
awk '{print $1}' sales.txt # первый столбец: имена
awk '{print $1, $3}' sales.txt # первый и третий, через пробел
awk '{print $NF}' sales.txt # последний столбец
awk '{print $1 ": " $3}' sales.txt # с собственным текстомДругой разделитель
awk -F: '{print $1}' /etc/passwd # двоеточие: имена пользователей
awk -F, '{print $2}' data.csv # запятая
awk -F'\t' '{print $1}' data.tsv # табуляция
awk 'BEGIN {FS=";"} {print $2}' data.csv # то же через переменную FSПростой -F, не учитывает запятые внутри кавычек. Для сложного CSV используйте специальные инструменты вроде csvkit.
Условия
awk '$3 > 100' sales.txt # строки, где третий столбец больше 100
awk '$2 == "Москва" {print $1}' sales.txt # имена из Москвы
awk 'NR > 1' sales.txt # пропустить первую строку (заголовок)
awk 'NR == 2, NR == 3' sales.txt # строки со второй по третью
awk '/Москва/ {print $1}' sales.txt # строки, содержащие словоСумма, среднее, количество
awk '{sum += $3} END {print sum}' sales.txt # 450
awk '{sum += $3} END {print sum / NR}' sales.txt # 112.5
awk '$2 == "Москва" {n++} END {print n}' sales.txt # 2
awk '{total[$2] += $3} END {for (c in total) print c, total[c]}' sales.txt # сумма по городамБлок END выполняется один раз после обработки всех строк. Переменная NR хранит номер текущей строки, в END это общее число строк.
Уникальные значения
awk '!seen[$2]++ {print $2}' sales.txt # города без повторов, в порядке появленияФорматированный вывод
awk '{printf "%-8s %5d\n", $1, $3}' sales.txtФормат printf как в языке C: %-8s строка шириной 8 влево, %5d целое шириной 5 вправо. Версия mawk, которая стоит в Debian и Ubuntu по умолчанию, считает ширину в байтах, поэтому кириллица выравнивается неточно. Установите gawk, если нужны ровные столбцы с русскими словами.
Передать значение из оболочки
limit=100
awk -v min="$limit" '$3 > min {print $1}' sales.txtНе подставляйте переменную оболочки внутрь программы awk в одинарных кавычках: используйте -v.
Частые вопросы
Чем awk отличается от cut?
cut режет по одному символу-разделителю. awk понимает группы пробелов как один разделитель, умеет условия и вычисления.
Как вывести столбцы с пробелами в значениях?
Выберите явный разделитель: awk -F'\t' для табуляции или -F, для запятой. Разделение по пробелам разобьёт значение на части.
Почему awk на macOS ведёт себя иначе?
На macOS стоит BSD-версия awk, а на многих Linux gawk или mawk. Базовые возможности из этой заметки работают одинаково везде.