希望得到帮助。我有一个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中更容易完成。
非常感谢!
答案 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记录条目文件的速度有多快。您可以使用重定向运算符
将其写入新文件