Linux Labs

Bash: обработка текста и скрипты / Ступень 2 из 9

sed и awk: правка и поля потока

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 5 из 9 · на машине · 4 мин

Сумма по каждому клиенту

Одна сумма на весь файл — не предел. Таблицу «клиент — сумма» awk собирает за один проход.

Вместо одной переменной берут массив — переменную с ячейками, у каждой ячейки своё имя. s[$2] += $3 прибавляет платёж в ячейку с именем клиента из второго поля: платёж acme — в s["acme"], платёж hooli — в s["hooli"]. В блоке END цикл for (k in s) проходит по всем ячейкам, а print k, s[k] печатает имя ячейки и её сумму.

bash
awk -F',' '{s[$2] += $3} END {for (k in s) print k, s[k]}' payments.csv
Проверь себя 1 вопрос

Бухгалтеру нужна эта таблица с клиентами по алфавиту. Что сделаешь?

  • Посмотри на вывод: umbrella стоит раньше acme. Ячейки массива awk обходит в своём порядке.

  • Так поменяется порядок полей в строке, а порядок строк останется прежним: ячейки awk обходит в своём порядке.

  • Порядок обхода ячеек awk выбирает сам, и порядок строк файла его не задаёт. Упорядочить можно сам вывод — | sort.

for (k in s) обходит ячейки массива в порядке, который выбирает сам awk, — с алфавитом и порядком строк файла он не связан. Нужен порядок — вывод передают в sort.

Строка client 0 в выводе — заголовок файла: awk завёл ячейку и для него. Перед действием можно поставить условие, и действие выполнится в строках, где оно верно. Номер строки awk держит в NR, поэтому NR > 1 { … } пропускает заголовок. Условие — любое сравнение: $3 > 1000 { … } возьмёт платежи больше тысячи.

Главное в шаге

  • Массив s[$2] += $3 копит сумму отдельно для каждого значения поля.
  • for (k in s) в блоке END печатает ячейки в порядке, который выбрал awk; порядок задаёт sort после awk.
  • Условие перед действием, например NR > 1, оставляет действию нужные строки.
Ubuntu 24.04
Загрузка…