计算一个唯一的字符串

时间:2014-02-06 22:25:16

标签: uniq

我尝试使用“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

3 个答案:

答案 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 []中的元素并将其打印出来。