首页 > 解决方案 > 如果使用 awk 或 sed 某些正则表达式为真,则更改列

问题描述

我有一个与此类似的文件(我们称之为 data.csv)

"123","456","ud,h-match","moredata"

具有相同格式的许多行和嵌入的逗号。我需要做的是查看第三列,看看它是否有表达式。在这种情况下,我想知道第三列是否在任何地方都有“匹配”(确实如此)。如果有的话,那么我将整个列替换为“替换”之类的其他内容。因此,要将其与示例 data.csv 文件相关联,我希望它看起来像这样。

“123”、“456”、“替换”、“更多数据”

理想情况下,我希望更改文件 data.csv 本身(时间很重要,因为我有一个大文件),但如果您将其写入另一个文件也可以。

编辑:

我尝试过使用 awk:

awk -F'","' -OFS="," '{if(tolower($3) ~ "stringI'mSearchingFor"){$3="replacement"; print}else print}' file

但它并没有改变任何东西。如果我删除 OFS 部分,那么它可以工作,但它会被空格分隔,并且列不会被双引号括起来。

标签: csvawksed

解决方案


根据我对您的意思的问题的回答column,这可能是您想要的(使用 GNU awk 进行 FPAT):

$ awk -v FPAT='[^,]+|"[^"]+"' -v OFS=',' '$3~/match/{$3="\"replaced\""} 1' file
"123","456","replaced","moredata"

awk -i inplace ...如果您想进行“就地”编辑,请使用。

使用任何 awk (但比上面的更脆弱,因为它"在第一个和最后一个字段上留下前导/尾随,并且没有-i inplace):

$ awk 'BEGIN{FS=OFS="\",\""} $3~/match/{$3="replaced"} 1' file
"123","456","replaced","moredata"

推荐阅读