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

时间:2016-11-28 08:53:13

标签: shell sorting awk

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

cts:query

我需要提取第3列(" DE")然后将其限制为其唯一值。这就是我提出的问题(gawk和gsort,因为我正在运行MacOS并且只有" - 并行"选项通过GNU排序):

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

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

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

非常感谢!

1 个答案:

答案 0 :(得分: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记录条目文件的速度有多快。您可以使用重定向运算符

将其写入新文件