我有一个大的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
这里有解决这个长名单的方法吗?我们也欢迎全新的解决方案。提前致谢。
注意:宁愿避免循环遍历列表,因为它会降低性能。
答案 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?了解原始代码的情况以及解决问题的方法。