使用sed或awk用另一个值替换字段

时间:2017-02-25 06:20:49

标签: bash awk sed

我有一个文本文件,其中包含以下行;

100 200 300
50 120 200
60 500 340

我正在编写一个脚本来根据用户输入更改任何字段的值。如果用户在bash中给出no($ colno)列和行号($ rowno),我使用以下代码来确定要替换的确切字段。

awk -v i=$colno -v j=$rowno 'NR ==j {print $i}' file

因此,如果用户将$ colno设为1,将$ rownno设为3,则可以在第3行(60)中找到$ 1字段。

现在我想用其他一些用户给定的值($ new_val)永久地替换这个值(60)。

如何使用sed或awk执行此操作?这段代码将允许我使用用户指定的新值更改用户指定的任何字段。代码不应更改任何其他字段,即使具有相同的值。

请帮帮我。提前感谢你。

2 个答案:

答案 0 :(得分:6)

只需用所需的值替换该列,

colno=1
rowno=3

awk -v i=$colno -v j=$rowno  -v newvalue=20 'NR ==j {$i=newvalue}1' file
100 200 300
50 120 200
20 500 340

部分{$i=newvalue}1设置$1的值,即从当前示例第3行和第1列设置为newvalue中设置的值。 {}1根据个人重新定位重建每一行。

答案 1 :(得分:3)

使用GNU sed,在第$rowno行替换$colno次出现的非空格字符$newtext值:

sed -E "${rowno}s/[^ ]*( *)/${newtext}\1/${colno}" file