![计算文件第一列中的出现次数](https://linux22.com/image/1343600/%E8%AE%A1%E7%AE%97%E6%96%87%E4%BB%B6%E7%AC%AC%E4%B8%80%E5%88%97%E4%B8%AD%E7%9A%84%E5%87%BA%E7%8E%B0%E6%AC%A1%E6%95%B0.png)
我们有这个文件:
1 2
1 3
1 2
3 3
52 1
52 300
以及其他 1000 个。
我想计算第一列中每个值出现的次数。
1 3
3 1
52 2
这意味着我们见过1
三次。
我怎样才能在 Perl、AWK 或 Bash 中做到这一点?
答案1
如果输入已排序,则可以使用 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