在一组文件中显示唯一列条目数的高效方法?

时间:2017-04-05 01:41:55

标签: shell unix awk command-line

我试图将大量文​​件传输到一系列命令中,这些命令显示所述文件的给定列中的唯一条目数。我对外壳缺乏经验,但过了一会儿我就能想到这个:

awk '{print $5 }' | sort | uniq | wc - l

这一系列命令适用于少量文件,但在目标集上执行会花费不可接受的时间。是否有一组可以更有效地完成此任务的命令?

4 个答案:

答案 0 :(得分:1)

您可以使用awk:

计算第一个字段中唯一出现的值
awk '{if (!seen[$5]++) ++ctr} END {print ctr}'

这会在第五个字段中创建一个值数组,如果该值以前从未见过,则递增ctr变量。 END规则打印计数器的值。

使用GNU awk,您也可以在最后检查关联数组的长度:

awk '{seen[$5]++} END {print length(seen)}'

答案 1 :(得分:1)

Benjamin提供了优质的油,但是根据数据中存储的数据量,无论如何都可能需要将数据传递给wc:

awk '!_[$5]++' file | wc -l

答案 2 :(得分:1)

sortest和最快(我可以)使用awk但距离以前版本的@BenjaminW不远。我认为更快一点(差异只能在非常大的文件上有趣),因为在过程的早期进行了测试

awk '!E[$5]++{c++}END{print c}' YourFile

适用于所有awk版本

答案 3 :(得分:0)

GNU datamash为列提供 count 函数:

datamash -W count 5