我尝试使用“uniq -c”来计算第二行中的字符串 我的文件A有大约500,000行,看起来像这样
FILE_A
30-Nov 20714 GHI 235
30-Nov 10005 ABC 101
30-Nov 10355 DEF 111
30-Nov 10005 ABC 101
30-Nov 10005 ABC 101
30-Nov 10355 DEF 111
30-Nov 10005 ABC 101
30-Nov 20714 GHI 235
...
我使用的命令
sort -k 2 File_A | uniq -c
我发现我得到的结果与线条不符 我该如何解决这个问题?或者是否有其他方法可以统计唯一的字符串?
我得到的结果将类似于此(我只是随机编写了数字)
70 30-Nov 10005 ABC 101
5 30-Nov 10355 DEF 111
55 30-Nov 20714 GHI 235
答案 0 :(得分:1)
您还需要告诉uniq
仅考虑该字段,就像使用sort
一样。也许你可以-f
使用--skip-fields
。{您遇到的问题是uniq
没有“要检查的字段数”。
否则,如果您不需要保留原始字符串,则可以:
cut -d' ' -f2 | sort ...
答案 1 :(得分:0)
如果您打算计算第二列中的唯一值,即其中包含20714, 10005, ...
的唯一值,则需要先使用cut提取它。
cut -d' ' -f 2 File_A | sort | uniq -c
答案 2 :(得分:0)
以下是一对或三种其他方法。这些解决方案的好处是文件没有排序 - 而是依赖于哈希(关联数组)来跟踪唯一的事件。
方法1:
perl -ane 'END{print scalar keys %h,"\n"}$h{$F[1]}++' File_A
“-ane”使Perl循环遍历File_A中的行,并将数组F []的元素设置为等于每行的字段。所以你的唯一数字最终以F [1]结尾。 %h是一个哈希值。由$ F [1]索引的哈希元素随着每一行的处理而递增。最后,运行END {}块,它只是打印哈希值中的元素数。
方法2:
perl -ane 'END{print "$u\n"}$u++ if $h{$F[1]}++==1' File_A
与上面的方法类似,但这次变量$ u在每次递增哈希值时都会递增,结果变为1 - 即我们第一次看到该数字。
我确信@mpapec或@fedorqui可以用一半的代码完成它,但你明白了!
方法3:
awk 'FNR==NR{a[$2]++;next}{print a[$2],$0}END{for(i in a)u++;print u}' File_A File_A
结果:
2 30-Nov 20714 GHI 235
4 30-Nov 10005 ABC 101
2 30-Nov 10355 DEF 111
4 30-Nov 10005 ABC 101
4 30-Nov 10005 ABC 101
2 30-Nov 10355 DEF 111
4 30-Nov 10005 ABC 101
2 30-Nov 20714 GHI 235
3
这使用awk并在文件中运行两次 - 这就是它在命令末尾出现两次的原因。在第一遍时,运行“FNR == NR”之后的花括号中的代码,它将关联数组a []的元素递增为字段2($ 2)索引,因此它基本上计算每个id的次数看到了第2场。然后,在第二遍中,运行第二组花括号中的部分,并打印第一遍中看到id的总次数加上当前行。最后,运行END {}块并计算关联数组a []中的元素并将其打印出来。