使用 nawk 仅替换特定字段中的特定文本

使用 nawk 仅替换特定字段中的特定文本

我的输入数据文件 abc.txt 有这个

"20131008","0004","0568","98"

我运行这个命令来替换文本

nawk -F, -vOFS=',' '{gsub("0568","0808",$3); print }' abc.txt

在输出中,分隔符“,”被替换为空格。输出看起来像这样。

 "20131008" "0004" "0568" "98".

有人可以帮忙解决这个问题吗?我尝试更换-vOFS但不起作用。

答案1

这个答案在命令行输出和文件更改中进行了演示awk和示例。sed

对于awk,我们将$ awk -F"," '{gsub("0568", "0808", $3)}1' input.txt在命令行输出(或变量)中使用并接收更改后的字符串,但原始文件不会更改。

$ cat input.txt 
"20131008","0004","0568","98"
$ awk -F"," '{gsub("0568", "0808", $3)}1' input.txt
"20131008" "0004" "0808" "98"

对于sed,我们将使用简单的形式sed -i 's/string to replace/new string/g' input.txt,其中-i标志表示就地更改(即修改原始文件)。

$ cat input.txt 
"20131008","0004","0568","98"
$ sed -i 's/0568/0808/g' input.txt
$ cat input.txt 
"20131008","0004","0808","98"

虽然这不是您所要求的nawk(我没有安装),但我希望您会发现它有帮助。

答案2

我没有,nawk但这对我有用(gawk使用--posix开关):

awk 'BEGIN{FS=OFS=","}{sub(/0568/,"0808",$3)}1' file

费多基的评论建议您可能需要使用-v OFS=','而不是,-vOFS=','但如果输入和输出分隔符相同,则块中的赋值BEGIN不会太长。我也将您更改gsub为,sub因为看起来您只想进行一项替换。这两个函数的第一个参数都是正则表达式,因此您不应向其传递字符串。

输出:

"20131008","0004","0808","98"

答案3

我试过这个:

nawk 'BEGIN { FS=OFS="," } { sub("0568","0808",$3) }1' abc.txt

效果很好。

相关内容