查找并替换文件的选定列中的大量字符串列表

时间:2018-05-31 19:10:25

标签: shell csv awk sed gsub

我有一个大的CSV文件(~1GB) - data.csv
带有巨大管道分隔字符串列表的变量 list="abc|def|ghi.........."

目标是针对data.csv变量中列出的每个字符串搜索list第2和第3 列,并将其替换为字符串unassigned

以下是我的想法,
awk -v list="$list" 'BEGIN{FS=OFS=","}{gsub(list,"unassigned",$2)}{gsub(list,"unassigned",$3)}1' data.csv > data_new.csv

只要列表很小,它就可以正常工作。一旦列表变量跨越大约10k个字符串,它就会抛出错误
/usr/bin/awk: Argument list too long

这里有解决这个长名单的方法吗?我们也欢迎全新的解决方案。提前致谢。

注意:宁愿避免循环遍历列表,因为它会降低性能。

1 个答案:

答案 0 :(得分:1)

如果您使用bash,请执行此操作:

awk '
BEGIN { FS=OFS="," }
NR==FNR { list=$0; next}
{ gsub(list,"unassigned",$2); gsub(list,"unassigned",$3) }
1' <<<"$list" data.csv > data_new.csv

请参阅Why do I get "/bin/sh: Argument list too long" when passing quoted arguments?Does "argument list too long" restriction apply to shell builtins?了解原始代码的情况以及解决问题的方法。