regex - 过滤 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
解决方案
更容易做到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 error
或memory error
推荐阅读
- reactjs - babel-plugin-styled-components 不适用于预设打字稿
- javascript - 如何在 Jest 测试中更改元素属性?
- sharepoint - 如何使用 rest api 找到共享点站点的文件和文件夹结构?
- sql - Oracle 函数 - 未知数量的参数
- python-3.x - 我怎样才能滚动到一些元素并收集数据
- python - 如何使用 python 从头开始创建曲线坐标网格?
- java - 在Java中对具有特殊字符的整数进行排序
- html - 单击主标题时如何隐藏html表格特定的子标题
- css - 当菜单项分成两行时,从块中删除空格
- javascript - 如何从 GitHub 检索热门用户?