计算 2 列内唯一行的数量

计算 2 列内唯一行的数量

我有一个数据文件,其中一部分如下所示:

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出现保留键的“可见顺序” - 但我不知道这是否得到保证。

相关内容