使用shell脚本统计列中的唯一值

7
我有一个包含5列的制表符分隔文件,需要检索第2列中唯一行的数量。通常我会使用Perl/Python来完成这个任务,但是这次我被迫使用shell。过去我曾经成功地使用 *nix uniq 函数管道传输到 wc 命令,但现在看来我必须在这里使用 awk 命令。如果您有任何建议,将不胜感激。(我之前曾经提出过类似问题,关于使用awk检查列,但这次稍有不同,我想把它单独分离出来,以便将来有人遇到这个问题时可以找到这里)。非常感谢!
Lilly
3个回答

22

不需要使用awk。

$ cut -f2 file.txt | sort | uniq | wc -l

应该这样做。

这是利用制表符是cut的默认字段分隔符的事实,因此我们将以这种方式仅获取第二列的内容。然后通过sort进行一次预处理,以便在uniq中去除重复项。最后,我们计算行数,这就是所需的数字。


1
太棒了。在折腾一番后,我发现可以通过以下方式找到任何重复项: cat file.txt | awk '{print $2}' | sort | uniq -c | sort -n - Lilly Tooner

5

我选择

$ cut -f2 file.txt | sort -u | wc -l

至少在某些版本中,uniq 要求输入数据已排序(它仅查看相邻的行)。

例如,在Solaris文档中:

uniq 实用程序将读取一个输入文件,比较相邻的行,并将每个输入行的一个副本写入输出。不会写入重复的相邻输入行的第二个及后续副本。

如果重复的行不相邻,则不会检测到输入中的重复行。


0
awk '{if($0~/Not Running/)a++;else if($0~/Running/)b++}END{print a,b}' temp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接