2016-11-28 24 views
1

希望得到帮助。我有一个300万行文件,data.txt,用“|”分隔,例如。提取一列然后在一个大的分隔文件中找到它的uniq项目的最快方法

"4"|"GESELLSCHAFT FUER NUCLEONIC & ELECT MBH"|"DE"|"0" 
"5"|"IMPEX ESSEN VERTRIEB VON WERKZEUGEN GMBH"|"DE"|"0" 

我需要提取第三列(“DE”),然后将其限制为其唯一值。这里是我想出(观看或gsort因为我运行MacOS和只有通过GNU排序“--parallel”选项):

gawk -F "|" '{print $3}' data.txt \ 
    | gsort --parallel=4 -u > countries.uniq 

这工作,但它是不是很快速。我有类似的任务提出了一些更大的(11M记录)文件,所以我想知道是否有人可以指出一个更快的方式。

我希望留在shell中,而不是说Python,因为一些相关的处理在shell中更容易完成。

非常感谢!

+0

为什么不使用'uniq'? – Yaron

+0

我认为在shell中没有太多开销,而像gawk和gsort这样的unix工具是高度优化的。 – clemens

+0

如果以下解决方案对于您的输入更快,您能评论吗? – Inian

回答

3

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 

取出里面print

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

你可以看到它是一个11M记录项文件的速度有多快。您可以使用重定向运算符将其写入新文件

+0

谢谢你的快速回答。您的解决方案可以快速为每个字段3的值生成一行,这非常棒。但是,我需要再走一步,提取字段3的唯一值,例如, “GB” “DE” 我试过了几个变体,但没有成功。我可能会因为什么可能是明显的修改而烦恼吗?非常感谢。 – ghoetker

+0

谢谢你的跟进。很高兴地报告说,这些选项的工作速度比我之前的速度快得多。 – ghoetker

相关问题