我试图将大量文件传输到一系列命令中,这些命令显示所述文件的给定列中的唯一条目数。我对外壳缺乏经验,但过了一会儿我就能想到这个:
awk '{print $5 }' | sort | uniq | wc - l
这一系列命令适用于少量文件,但在目标集上执行会花费不可接受的时间。是否有一组可以更有效地完成此任务的命令?
答案 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