首页 > 解决方案 > 过滤 CSV 文件中的数据

问题描述

我有这种格式的 CSV 文件

a,b,c,d,e,f,no disk detected
a,b,c,d,e,f,disk run into error
a,b,c,d,e,f,no memory in the server
a,b,c,d,e,f,memory has correctable errors

在最后一列,我需要搜索这个词

磁盘并将其替换为磁盘错误内存并将其替换为内存错误那部分我已经弄清楚了

 cat filename.csv |awk -F "," '{print $NF}' |sed 's/^.*disk.*$/disk error/'  |sed 's/^.*memory.*$/memory error/' 

现在sed替换这个字符串时我需要帮助的部分,是否可以写入同一个文件(filename.csv)或生成一个包含所有列+更新列的新文件,所以新文件看起来像这样

 a,b,c,d,e,f,disk error
 a,b,c,d,e,f,disk error
 a,b,c,d,e,f,memory error
 a,b,c,d,e,f,memory error

标签: regexlinuxcsvawksed

解决方案


更容易做到sed

sed -E 's/^(.+,).*(disk|memory).*$/\1\2 error/' file.csv

a,b,c,d,e,f,disk error
a,b,c,d,e,f,disk error
a,b,c,d,e,f,memory error
a,b,c,d,e,f,memory error

要在同一文件中进行内联更改,请使用:

sed -i.bak -E 's/^(.+,).*(disk|memory).*$/\1\2 error/' file.csv

== 详情 ==

搜索正则表达式:

  • ^: 开始
  • (.+,)贪婪匹配直到最后一个逗号并将其捕获到第 1 组
  • .*(disk|memory)disk: 在匹配or之前匹配 0 个或多个字符memory并将其捕获到组 #2
  • .*$: 在 end 之前匹配 0 个或多个字符

更换模式:

  • \1: 对组 #1 的反向引用以将文本放置到最后一个逗号后面
  • \2 error: 附加disk errormemory error

推荐阅读