Shell 在一组文件中显示唯一列条目数的性能方法?

Shell 在一组文件中显示唯一列条目数的性能方法?,shell,unix,awk,command-line,Shell,Unix,Awk,Command Line,我试图通过管道将大量文件传输到一系列命令中,这些命令在给定的文件列中显示唯一条目的数量。我对壳牌公司缺乏经验,但过了一会儿,我就想出了这个办法: awk '{print $5 }' | sort | uniq | wc - l 这一系列命令对于少量文件来说效果很好,但在我的目标集上执行所需的时间却不可接受。是否有一组命令可以更有效地完成此任务?您可以使用awk在单个过程中计算第五个字段中出现的唯一值: awk '{if (!seen[$5]++) ++ctr} END {print ctr}'

我试图通过管道将大量文件传输到一系列命令中,这些命令在给定的文件列中显示唯一条目的数量。我对壳牌公司缺乏经验,但过了一会儿,我就想出了这个办法:

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

这一系列命令对于少量文件来说效果很好,但在我的目标集上执行所需的时间却不可接受。是否有一组命令可以更有效地完成此任务?

您可以使用awk在单个过程中计算第五个字段中出现的唯一值:

awk '{if (!seen[$5]++) ++ctr} END {print ctr}'
这将在第五个字段中创建一个值数组,并增加
ctr
变量(如果该值以前从未见过)。
END
规则打印计数器的值

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

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

您可以使用awk在单个过程中统计第五个字段中出现的唯一值:

awk '{if (!seen[$5]++) ++ctr} END {print ctr}'
这将在第五个字段中创建一个值数组,并增加
ctr
变量(如果该值以前从未见过)。
END
规则打印计数器的值

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

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

Benjamin提供了优质的润滑油,但根据阵列中存储的数据量,将数据传递给wc可能会有回报:

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

Benjamin提供了优质的润滑油,但根据阵列中存储的数据量,将数据传递给wc可能会有回报:

awk '!_[$5]++' file | wc -l
使用awk是最快的(我能做到的),但距离@BenjaminW的前一个版本不远。我认为更快一点(差异可能只对非常大的文件感兴趣),因为在这个过程的早期进行了测试

awk '!E[$5]++{c++}END{print c}' YourFile
适用于所有awk版本,是使用awk的最快(我能做到的),但与@BenjaminW的早期版本相差不远。我认为更快一点(差异可能只对非常大的文件感兴趣),因为在这个过程的早期进行了测试

awk '!E[$5]++{c++}END{print c}' YourFile
适用于所有awk版本GNU具有列计数功能:

datamash -W count 5
GNU有一个列计数函数:

datamash -W count 5

您可以使用
sort-u
而不是
sort | uniq
。您实际要处理多少行输入?你能不能加入一些简单的输入数据,让我们看看你到底想做什么?还请将您的预期输出与您提供的示例输入一起包括在内。您是在每个文件中还是在所有文件中查找第5列中的唯一项?您可以使用
sort-u
而不是
sort | uniq
。您实际要处理多少行输入?你能不能加入一些简单的输入数据,让我们看看你到底想做什么?还请将您的预期输出与您提供的示例输入一起包括在内。您是在每个文件或所有文件中查找第5列中的唯一项?