проблема значения ключа awk для массива - PullRequest
0 голосов
/ 12 ноября 2018

Я столкнулся с проблемой массива awk, подробности приведены ниже:

[~/temp]$ cat test.txt
1
2
3
4
1
2
3

Тогда я хочу посчитать частоту числа.

[~/temp]$ awk 'num[$1]++;END{for (i in num){printf("%s\t%-s\n", num[i],i)|"sort -r -n -k1"} }' test.txt
1
2
3
2       3
2       2
2       1
1       4

Как вы видите, почему вывод первых 3 строк '1 2 3' станет пустым значением?

Спасибо за ваш ответ.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Оператор 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
0 голосов
/ 12 ноября 2018

Поместите свою часть "на линию" в {}, т.е. { num[$1]++; }

awk программирует коллекцию [pattern] { actions } (шаблон необязательный, {} - нет). Кажется, что в вашем случае ваша линия рассматривается как шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...