使用 awk 搜索并替换第 n 列

使用 awk 搜索并替换第 n 列

我们如何仅在 col3 中搜索并替换“xyz”?

col1,col2,col3,col4  
abc,def,xyz,xyz  
xyz,abc,def,xyz

答案1

尝试这个:

awk -F , '{ if ($3 == "xyz") $3="abc";}1' OFS=, test.csv

答案2

您没有提到要替换它的内容,所以我只是将其用作ghi占位符:

如果那是实际的文本,那么最简单的方法是使用sed.您可以这样做,awk但这只会将修改发送到标准输出,而sed可以更改文件本身,如下所述:

sed '2s|xyz|ghi|1' file

解释:

2s replaces instances on the second line
xyz is what you want to replace
ghi is what it's being replaced with
1 replaces the first instance of it on the specified line

输出:

col1,col2,col3,col4
abc,def,ghi,xyz
xyz,abc,def,xyz

一旦您确定它执行了您想要的操作,请使用开关-i更改文件本身,而不是将其发送到标准输出:

sed -i '2s|xyz|ghi|1' file

如果您可能想要替换其他行和列,则需要修改2s1指定位置和实例。显然,您也可以ghi用您想要的任何替代品进行替换。

如果第 3 列中还有其他行需要替换xyz,可以使用e开关。例如:

col1,col2,col3,col4
abc,def,xyz,xyz
xyz,abc,def,xyz
abc,def,xyz,abc

xyz也出现在第 3 列的第四行。

sed -e '2s|xyz|ghi|1' -e '4s|xyz|ghi|1' file

sed -i -e '2s|xyz|ghi|1' -e '4s|xyz|ghi|1' file

这将替换第四行的第一个实例,并用于-e指定每个替换流。该-i开关更改文件而不是仅将其发送到标准输入。

答案3

awk -F ',' -v needle='xyz' -v replacement='foobar' 'BEGIN{ OFS = FS; } (NR > 1 && $3 == needle) { $3 = replacement; } 1' input.txt

设置needlereplacement根据需要。NR > 1确保第一行(显然包含列标题)中不会发生替换。

相关内容