Одна сумма на весь файл — не предел. Таблицу «клиент — сумма» awk собирает за один проход.
Вместо одной переменной берут массив — переменную с ячейками, у каждой ячейки своё имя. s[$2] += $3 прибавляет платёж в ячейку с именем клиента из второго поля: платёж acme — в s["acme"], платёж hooli — в s["hooli"]. В блоке END цикл for (k in s) проходит по всем ячейкам, а print k, s[k] печатает имя ячейки и её сумму.
Бухгалтеру нужна эта таблица с клиентами по алфавиту. Что сделаешь?
-
Посмотри на вывод: 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, оставляет действию нужные строки.