Linux awk: как вывести нужный столбец и посчитать сумму

Категория: Bash · Язык: Bash · Обновлено:

Чтобы вывести столбец, используйте awk '{print $2}' файл: $1 первый столбец, $2 второй, $NF последний, а $0 вся строка. По умолчанию столбцы разделены пробелами или табуляцией, другой разделитель задаётся ключом -F.

Для примеров возьмём файл sales.txt:

Текст
Анна Москва 120
Борис Казань 80
Вера Москва 200
Глеб Сочи 50

Вывести столбцы

Bash
awk '{print $1}' sales.txt           # первый столбец: имена
awk '{print $1, $3}' sales.txt       # первый и третий, через пробел
awk '{print $NF}' sales.txt          # последний столбец
awk '{print $1 ": " $3}' sales.txt   # с собственным текстом

Другой разделитель

Bash
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.

Условия

Bash
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           # строки, содержащие слово

Сумма, среднее, количество

Bash
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 это общее число строк.

Уникальные значения

Bash
awk '!seen[$2]++ {print $2}' sales.txt        # города без повторов, в порядке появления

Форматированный вывод

Bash
awk '{printf "%-8s %5d\n", $1, $3}' sales.txt

Формат printf как в языке C: %-8s строка шириной 8 влево, %5d целое шириной 5 вправо. Версия mawk, которая стоит в Debian и Ubuntu по умолчанию, считает ширину в байтах, поэтому кириллица выравнивается неточно. Установите gawk, если нужны ровные столбцы с русскими словами.

Передать значение из оболочки

Bash
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. Базовые возможности из этой заметки работают одинаково везде.