首页 > 解决方案 > 在文件的选定列中查找并替换大量字符串

问题描述

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

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

下面是我想出的,
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

有什么解决方案来处理这个长长的列表吗?也欢迎全新的解决方案。提前致谢。

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

标签: shellcsvawksedgsub

解决方案


如果您使用 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

请参阅为什么在传递引用的参数时会得到“/bin/sh:参数列表太长”?“参数列表太长”限制是否适用于 shell 内置函数?了解您的原始代码发生了什么以及如何解决问题。


推荐阅读