【发布时间】:2019-12-08 21:55:55
【问题描述】:
我想要:
$ 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 awk sed large-files uniq