8

У нас есть этот файл:

1 2 
1 3
1 2
3 3
52 1
52 300

и еще 1000.

Я хочу посчитать, сколько раз каждое значение встречается в первом столбце.

1  3 
3  1
52 2

Это означает, что мы видели 1 три раза.

Как я могу это сделать в Perl, AWK или Bash?

1 ответ1

12

Если вход отсортирован, вы можете использовать uniq:

<infile cut -d' ' -f1 | uniq -c

Если нет, сначала отсортируйте это:

<infile cut -d' ' -f1 | sort -n | uniq -c

Выход:

  3 1                                      
  1 3
  2 52

Вывод поменялся по сравнению с вашим требованием, вы можете использовать awk '{ print $2, $1 }' чтобы изменить это.

1 3 
3 1
52 2

Есть также идиома awk, которая не требует сортированного ввода:

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'

Выход:

1 3
52 2
3 1

Так как вывод здесь происходит из хеша, он не будет упорядочен, передайте sort -n если это необходимо:

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n

Если вы используете GNU awk, вы можете выполнить сортировку изнутри awk:

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'

В последних двух случаях вывод:

1 3
3 1
52 2

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .