2010-05-06 103 views
5

我有一个带5列的制表符分隔文件,需要检索第2列中唯一行数的计数。我通常会使用Perl/Python执行此操作,但是我我被迫使用这个shell。使用shell脚本计算列中的唯一值

我已经成功地在过去使用* nix uniq函数传递给wc,但它看起来像我将不得不在这里使用awk。

任何意见将不胜感激。 (我曾问过一个类似的问题,关于使用awk的列检查,但这有点不同,我想分开它,所以如果将来有人有这个问题,这将在这里)

很多很多,谢谢!
Lilly

回答

16

不需要使用awk。

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

应该这样做。

这使用了标签为cut的默认字段分隔符的事实,因此我们将通过这种方式获取第2列中的内容。然后通过sort作为uniq的前期阶段,从而删除重复项。最后,我们计算线路,这是寻求的数字。

+1

这很好。在搞乱之后我发现我可以通过这个 cat file.txt | awk'{print $ 2}'|排序| uniq -c |排序-n – 2010-05-06 14:49:59

5

我去

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

至少在一些版本中,uniq依赖于被排序的输入数据(它只着眼于相邻的线)。

例如在Solaris docs

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

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

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