Подсчет вхождений в первом столбце файла

9

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

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

и еще 1000.

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

1  3 
3  1
52 2

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

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

Сыпь
источник
3
Привет арашам! Я видел, как вы недавно задавали очень похожие вопросы, которые все вращаются вокруг одной и той же темы. Я уверен, что сообщество хотело бы помочь вам, но, возможно, вы могли бы показать нам, что вы уже пробовали и где именно вы застряли? Мы требуем, чтобы люди приложили немного усилий, прежде чем задавать свои вопросы - не нужно учиться просто просить других дать вам код для конкретной вещи. Почему бы не сказать нам, что это за фон? Может быть, есть более простой способ выполнить то, что вы хотите, и нам не нужно прибегать к фиктивным примерам с некоторыми абстрактными числами?
Slhck
TNX за вашу помощь. Я работаю с данными bgpdump и анализирую их.
Араш

Ответы:

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
Тор
источник
tnx .its работал :)
Arash
Не могли бы вы объяснить, пожалуйста, код ??? awk '{h [$ 1] ++} END {for (k in h) print k, h [k]}' | sort -n
Arash
3
@arashams: {h[$1]++}блок оценивается для каждой строки. hявляется хешем и $1является первым столбцом и используется в качестве ключа в h. Так что это подсчитывает, как часто $1видны уникальные . ENDБлок выполняется в конце ввода, и печатает ключи и бирки. sort -nсортирует вывод численно.
Тор