我有一个数据文件,其中一部分如下所示:
4 1
5 2
1 2
3 1
1 1
1 2
1 1
1 1
2 1
2 1
我想计算相似的行并将计数放在第三列中,如下所示:
4 1 1
5 2 1
1 2 2
3 1 1
1 1 3
2 1 2
请问有什么建议吗?
答案1
这是一种方法。对文件进行排序,然后使用 获取计数uniq -c
,然后使用awk
翻转字段顺序。
$ sort file.txt | uniq -c | awk '{ print $2,$3,$1 }'
1 1 3
1 2 2
2 1 2
3 1 1
4 1 1
5 2 1
$
第二种方法,使用 pure awk
.
$ awk '{ x[$0]++ } END { for(a in x) { print a,x[a] } }' file.txt
1 1 3
1 2 2
4 1 1
2 1 2
5 2 1
3 1 1
$
第三种方式,perl
.有点老套/冗长,所以等待有人展示更优雅的方法。
$ perl -nle '$a{$_}++;END{for(keys %a) { print $_," ",$a{$_} } }' <file.txt
3 1 1
1 2 2
5 2 1
1 1 3
2 1 2
4 1 1
$
答案2
使用磨坊主:
$ mlr --nidx uniq -g 1,2 -c file
4 1 1
5 2 1
1 2 2
3 1 1
1 1 3
2 1 2
或者,等价地
mlr --nidx count-distinct -f 1,2 file
awk
与数组或哈希不同perl
,Miller出现保留键的“可见顺序” - 但我不知道这是否得到保证。