shell uniq -c在一列中

ht4b089n  于 2022-12-23  发布在  Shell
关注(0)|答案(2)|浏览(117)

假设我们有一个txt文件,如下所示:

输入:

a1 D1
b1 D1
c1 D1
a1 D2
a1 D3
c1 D3

我想计算第一列中每个元素出现的时间,但也保留第二列提供的信息(某种程度上)。表示了潜在的可能输出格式,但也接受任何一致的替代格式:

可能的输出1:

3 a1 D1,D2,D3
1 b1 D1
2 c1 D1,D3

可能的输出2:

3 a1 D1
1 b1 D1
2 c1 D1
3 a1 D2
3 a1 D3
1 c1 D3

我该怎么做呢?我猜是sort -k 1 input | uniq -c <keep col2>的组合,或者可能使用awk,但是我不能写任何有效的东西。但是,所有的答案都被考虑了。

vom3gejh

vom3gejh1#

使用任意awk:

$ awk '
    {
        vals[$1] = ($1 in vals ? vals[$1] "," : "") $2
        cnts[$1]++
    }
    END {
        for (key in vals) {
            print cnts[key], key, vals[key]
        }
    }
' file
3 a1 D1,D2,D3
1 b1 D1
2 c1 D1,D3
ar5n3qh5

ar5n3qh52#

我将按照以下方式利用GNU AWK完成此任务,让file.txt内容

a1 D1
b1 D1
c1 D1
a1 D2
a1 D3
c1 D3

那么

awk 'FNR==NR{arr[$1]+=1;next}{print arr[$1],$0}' file.txt file.txt

给出输出

3 a1 D1
1 b1 D1
2 c1 D1
3 a1 D2
3 a1 D3
2 c1 D3

说明:2遍解决方案(观察file.txt是否重复),第一遍计算第一列值的出现次数,并将该数据存储到数组arr中,第二遍用于打印数组中计算出的数字,然后打印整行。

  • (在GNU Awk 5.0.1中测试)*

相关问题