Awk: Как пройти через файл, чтобы получить каждую строку?

Проблема заключалась в том, что я повторно использовал СТАРЫЙ IP-адрес, к которому уже было привязано правило сетевого брандмауэра. Я был уверен, что в системе все в порядке, поэтому, когда я перенюхал пакеты, идущие на сервер, я увидел, что они были отброшены на уровне сетевого брандмауэра. Решил это и все стало хорошо.

0
21.08.2018, 00:47
2 ответа

Awk создает неявный цикл вокруг основной части скрипта: за исключением блоков BEGIN и END (и определений функций), скрипт выполняется для каждой строки в последовательности.Поэтому было бы очень странно иметь в awk-скрипте цикл типа for (i = 1; i<= NR; i++): когда awk проходит первую строку, выполняется тело цикла для i=1, затем awk проходит вторую строку и тело цикла выполняется для i=1 и i=2, затем awk проходит вторую строку и тело цикла выполняется для i=1 и i=2 и i=3 и т. д.

Предполагая, что имена сотрудников не повторяются, общая заработная плата каждого работника равна просто $2 * $3. Вы можете распечатать это, если хотите:

NR == 1 { print $1, $2, $3, "total" }
NR != 1 { print $1, $2, $3, $2 * $3 }

(Условие NR == 1 идентифицирует строку заголовка.)

Общая заработная плата всех сотрудников представляет собой сумму этого выражения для каждой строки кроме строки заголовка. Чтобы рассчитать общую заработную плату для всех сотрудников, добавьте заработную плату текущего сотрудника к промежуточной сумме.

NR != 1 { total += $2 * $3 }
2
28.01.2020, 02:16

В качестве альтернативы, что-то вроде этого работает нормально и имеет хороший вывод:

awk -v OFS="\t" 'NR==1{$4="total"}NR>1{$4=$2*$3}1' testfile.dat
#Output:
Name    Rate    Hours   total
Clark   8.5       42    357
Sarah   18.5      19    351.5
Joe     10        25    250
Paul    12         5    60
5
28.01.2020, 02:16

Теги

Похожие вопросы