【发布时间】:2018-11-10 21:02:37
【问题描述】:
我有一个大的 CSV 文件 (~1GB) - data.csv
一个包含大量管道分隔字符串列表的变量。list="abc|def|ghi.........."
目标是在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
只要列表很小,它就可以正常工作。一旦列表变量超过 10k 个字符串,它就会抛出错误/usr/bin/awk: Argument list too long
这里有什么解决方案来处理这个长长的列表吗?也欢迎全新的解决方案。提前致谢。
注意:最好避免循环遍历列表,因为它会降低性能。
【问题讨论】:
-
即使列表只有 2 个值
list='foo,bar',我也看不到它是如何工作的,因为 gsub 将寻找正则表达式foo,bar而不是我的 认为 你想要的是foo|bar。 edit您的问题包括简洁、可测试的样本输入和预期输出,以便我们为您提供帮助。 -
感谢您的更新。我在这里错过了
tr "," "|"。更正了变量数据。 -
你的行是用
|还是,分隔的? -
data.csv 由
,分隔,这就是为什么我添加BEGIN{FS=OFS=","}将其定义为分隔符