Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 提取列并在大型分隔文件中查找其uniq项的最快方法_Shell_Sorting_Awk - Fatal编程技术网

Shell 提取列并在大型分隔文件中查找其uniq项的最快方法

Shell 提取列并在大型分隔文件中查找其uniq项的最快方法,shell,sorting,awk,Shell,Sorting,Awk,希望得到帮助。我有一个300万行的文件data.txt,用“|”分隔,例如 我需要提取第三列(“DE”),然后将其限制为唯一值。以下是我的想法(在运行MacOS时,我使用了gawk和gsort,通过GNU排序只使用了“-parallel”选项): 这是可行的,但不是很快。我有类似的任务要处理一些更大的(11M记录)文件,所以我想知道是否有人能指出一种更快的方法 我希望留在shell中,而不是说Python,因为在shell中进行一些相关的处理要容易得多 非常感谢 awk是为此类任务量身定制的。下

希望得到帮助。我有一个300万行的文件data.txt,用“|”分隔,例如

我需要提取第三列(“DE”),然后将其限制为唯一值。以下是我的想法(在运行MacOS时,我使用了gawk和gsort,通过GNU排序只使用了“-parallel”选项):

这是可行的,但不是很快。我有类似的任务要处理一些更大的(11M记录)文件,所以我想知道是否有人能指出一种更快的方法

我希望留在shell中,而不是说Python,因为在shell中进行一些相关的处理要容易得多


非常感谢

awk
是为此类任务量身定制的。下面是一个最小的
awk
逻辑,可以为您实现这个技巧

awk -F"|" '!($3 in arr){print} {arr[$3]++} END{ for (i in arr) print i}' logFile
逻辑是当
awk
处理每一行时,它只在以前没有看到的情况下,才在
$3
中添加值条目。上面打印两个唯一的行,后跟来自
$3

如果只需要唯一的行,可以排除
END()
子句

awk -F"|" '!($3 in arr){print} {arr[$3]++}' logFile > uniqueLinesOnly
如果只想从文件中删除唯一值,请删除内部
打印

awk -F"|" '!($3 in arr){arr[$3]++} END{ for (i in arr) print i}' logFile > uniqueEntriesOnly

您可以看到11M记录条目文件的速度有多快。您可以使用重定向操作符将其写入一个新文件

为什么不使用
uniq
?我认为由于shell,您的代码中没有太多开销,unix工具如
gawk
gsort
都经过了高度优化。您能评论一下下面的解决方案对您的输入是否更快吗?谢谢您的快速回答。您的解决方案很快就能为字段3的每个值生成一行,这很好。但是,我还需要再做一步,提取字段3的唯一值,例如,“GB”“DE”。我尝试了几种变体,但都没有成功。我可以麻烦你一下,最明显的改动是什么吗?非常感谢。谢谢你的跟进。很高兴地报告,这些选项的工作速度比我以前的要快得多。
awk -F"|" '!($3 in arr){print} {arr[$3]++}' logFile > uniqueLinesOnly
awk -F"|" '!($3 in arr){arr[$3]++} END{ for (i in arr) print i}' logFile > uniqueEntriesOnly