shell - 在文件的选定列中查找并替换大量字符串
问题描述
我有一个大的 CSV 文件 (~1GB) - data.csv
一个包含大量管道分隔字符串的变量。
list="abc|def|ghi.........."
目标是搜索变量中列出的每个字符串的第 2 列和第 3列,并将其替换为字符串data.csv
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
有什么解决方案来处理这个长长的列表吗?也欢迎全新的解决方案。提前致谢。
注意:希望避免循环遍历列表,因为它会降低性能。
解决方案
如果您使用 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 内置函数?了解您的原始代码发生了什么以及如何解决问题。
推荐阅读
- firebase - Firebase 数据库不允许用户电子邮件的子字符串
- azure - 如何将组合索引添加到 azure cosmo DB
- parsing - 使用 Haskell 在引号之间解析
- jenkins - 在邮件正文 Jenkins 中传递阶段变量值
- java - 在 tomcat 上设置 Djavax.net.ssl.keyStore
- r - Rmosek中的svm负(正)半定矩阵
- python - 函数中未定义的名称
- vulkan - Vulkan 的新扩展 VK_KHR_vulkan_memory_model 的目的是什么?
- kubernetes - 具有公共和私有 NIC 的 VPS 上的 Kubernetes
- c# - Asp.Net Core 2.0 子域属性路由