我有一个很大的CSV文件(~1 1GB)- data.csv
一个变量,包含大量以竖线分隔的字符串。
list="abc|def|ghi.........."
Objective用于在data.csv
的第2列和第3列中搜索list
变量中列出的每个字符串,并将其替换为字符串unassigned
下面是我想出来的,
awk -v list="$list" 'BEGIN{FS=OFS=","}{gsub(list,"unassigned",$2)}{gsub(list,"unassigned",$3)}1' data.csv > data_new.csv
只要列表很小,它就可以正常工作。一旦list变量超过了大约10k个字符串,它就会抛出错误
/usr/bin/awk: Argument list too long
这里有没有什么解决方案可以处理这么长的列表?全新的解决方案也是受欢迎的。提前谢谢。
注意:我更喜欢避免遍历列表,因为这会降低性能。
发布于 2018-06-01 03:50:50
如果您使用的是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?,了解您的原始代码发生了什么以及这是如何解决问题的。
https://stackoverflow.com/questions/50631245
复制相似问题