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