разделитель полей awk: различия guish между -1, 10 и 1 - PullRequest
2 голосов
/ 04 апреля 2020

Допустим, у меня есть текстовый файл:

>>cat tmp.txt
1 1 1 1 1 -1 -1 -1 -1 -1 10 10 10 10 10

Я хочу найти число уникальных вхождений чисел 1, -1 и 10. Вот что я имею до сих пор:

awk -F '-1' '{print NF-1,NR}' tmp.txt | awk '{print $1}'
awk -F '10' '{print NF-1,NR}' tmp.txt | awk '{print $1}'
awk -F '1' '{print NF-1,NR}' tmp.txt | awk '{print $1}'

Где выходные данные 5, 5 и 15 вместо 5, 5 и 5. Похоже, что команда awk находит каждый экземпляр 1 для последней команды. Как это можно сделать правильно?

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Ваш 1 разделитель полей соответствует 1 в любом месте строки, независимо от контекста.

Действительный подход awk здесь заключается в использовании разделителя пробельных полей по умолчанию и подсчете значения этих полей, равных 1.

. Я предлагаю использовать

awk '{a=0;for(i=1;i<=NF;i++) { if($i=="1") {a++} };print a}' tmp.txt

См. онлайн-демонстрацию .

Эта команда awk назначает 0 переменной a, затем выполняет итерацию по всем полям (с for(i=1;i<=NF;i++) {...}) и увеличивает a при нахождении поля со значением 1 (см. if($i=="1") {a++} }), а затем печатает значение a.

1 голос
/ 04 апреля 2020

Использовать разделитель по умолчанию:

awk '{for(i=1;i<=NF;i++)cnt[$i]++};END{for(i in cnt)print i,cnt[i]}'
...