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列中的唯一项?