Оператор awk состоит из шаблона и связанного действия . Пропущенный шаблон соответствует каждой записи ввода. Опущенное действие - это псевдоним {print $0}
, т.е. вывести текущую запись, которую вы получаете. Глядя на первую часть вашей программы:
$ awk 'num[$1]++' file
1
2
3
Давайте немного изменим это, чтобы понять, что там происходит:
$ awk '{print "NR:",NR,"num["$1"]++:",num[$1]++}' file
NR: 1 num[1]++: 0
NR: 2 num[2]++: 0
NR: 3 num[3]++: 0
NR: 4 num[4]++: 0
NR: 5 num[1]++: 1
NR: 6 num[2]++: 1
NR: 7 num[3]++: 1
Поскольку вы используете постфиксный оператор num[$1]++
в шаблоне, в записях 1-4 он оценивается в 0, прежде чем его значение увеличивается. Вывод был бы другим, если бы вы использовали префиксный оператор ++num[$1]
, который сначала увеличивал бы значение переменной, после чего он получал бы оценку, и приводил бы к выводу каждой записи ввода, а не только последних трех, который вы получали.
Правильнее было бы использовать num[$1]++
как действие, а не как шаблон:
$ awk '{num[$1]++}' file