计算一行的重复列,打印所有行及其计数

问题描述 投票:0回答:1

我想要:

$ cat file
ABCDEFG, XXX
ABCDEFG, YYY
ABCDEFG, ZZZ
AAAAAAA, XZY
BBBBBBB, XYZ
CCCCCCC, YXZ
DDDDDDD, YZX
CDEFGHI, ZYX
CDEFGHI, XZY

$ cat file | magic
3 ABCDEFG, XXX
3 ABCDEFG, YYY
3 ABCDEFG, ZZZ
1 AAAAAAA, XZY
1 BBBBBBB, XYZ
1 CCCCCCC, YXZ
1 DDDDDDD, YZX
2 CDEFGHI, ZYX
2 CDEFGHI, XZY

因此,预排序的文件进入,在第一列中标识重复项,计算此重复项的行数,打印重复计数加上所有重复行及其内容,包括第2列中的内容,可以任何与唯一计数无关的东西。两个问题:

1)获得uniq -c的效果,但不删除重复项。

在线搜索后,我真正的“ hacky” sed -e解决方案是这样:

cat file | cut -d',' -f1 | uniq -c | sed -E -e 's/([0-9][0-9]*) (.*)/echo $(yes \1 \2 | head -\1)/;e' | sed -E 's/ ([0-9])/;\1/g' | tr ';' '\n'

[我很惊讶地看到head -\1之类的东西正常工作,但是很好。但是,我觉得应该有一个更简单的解决方案。

2)上面的内容摆脱了第二列。我可以先运行我的代码,然后将其paste运行到原始文件的第二列,但是该文件很大,我希望事情尽可能地提高速度。

有什么建议吗?

bash sed large-files uniq
1个回答
0
投票

awk中的一个。很累,所以没有经过充分测试。我希望它能工作,晚安:

$ awk '
$1!=p {
    for(i=1;i<c;i++)
        print c-1,a[i]
    c=1
}
{
    a[c++]=$0
    p=$1
}
END {
    for(i=1;i<c;i++)
        print c-1,a[i]
}' file

输出:

3 ABCDEFG, XXX
3 ABCDEFG, YYY
3 ABCDEFG, ZZZ
1 AAAAAAA, XZY
1 BBBBBBB, XYZ
1 CCCCCCC, YXZ
1 DDDDDDD, YZX
2 CDEFGHI, ZYX
2 CDEFGHI, XZY
© www.soinside.com 2019 - 2024. All rights reserved.