我想要:
$ 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
运行到原始文件的第二列,但是该文件很大,我希望事情尽可能地提高速度。
有什么建议吗?
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