我们如何仅在 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
如果您可能想要替换其他行和列,则需要修改2s
并1
指定位置和实例。显然,您也可以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
设置needle
并replacement
根据需要。NR > 1
确保第一行(显然包含列标题)中不会发生替换。