计算文件第一栏中的出现次数


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数据并进行解析。
Arash 2012年

Answers:


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对输出进行数字排序。
雷神
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.