我想在'test'文件中执行一些数值更改。由于我没有用'sed'怎么做,我试着用'awk'来做。在这种情况下,我想将第三行中的数字乘以一定数量。文件测试如下所述:
xxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyy
0.08 0.11 0.14 0.19 0.24 TERM
zzzzzzzzzzzzzzzzz
为此,我完成了以下脚本'file.awk':
BEGIN {}
/0.08/ {printf " %.2f %.2f %.2f %.2f %.2f %s",
$1*var, $2*var, $3*var, $4*var, $5*var, $6;}
{print;}
END{}
然后我在命令行中写道:
awk -v var=2 -f file.awk test
该脚本在我写的时候在线上运行,但它确实取代了该行。
xxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyy
0.16 0.22 0.28 0.38 0.48 TERM 0.08 0.11 0.14 0.19 0.24 TERM
zzzzzzzzzzzzzzzzzzzzz
我已经阅读过关于函数sub和gsub的内容,但是尽管我尝试过,但我没有成功地用新的替换旧行。
有什么想法吗?谢谢!
答案 0 :(得分:4)
您需要前进到下一行,否则将执行带有print
语句的以下块。像这样使用next
:
/0.08/ {printf " %.2f %.2f %.2f %.2f %.2f %s\n",
$1*var, $2*var, $3*var, $4*var, $5*var, $6; next}
顺便说一句,awk
是正确的工具。使用sed没有(合理的)方法来实现这一点,因为sed不支持数学运算。
另请注意,有多种方法可以实现此目的。查看@Jotne的答案以获得替代方案。
答案 1 :(得分:2)
您只需替换字段:
awk -v var=2 'NR==3 {$1=$1*var}1' file
xxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyy
0.16 0.11 0.14 0.19 0.24 TERM
zzzzzzzzzzzzzzzzz
此解决方案保留输入的格式:
awk 'NR==3 {f="";n=split($0,d,/[^[:space:]]*/);$1*=var;$2*=var;$3*=var;$4*=var;$5*=var;for(i=1;i<=n;i++) f=f d[i]$i;$0=f}1' var=2 t
xxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyy
0.16 0.22 0.28 0.38 0.48 TERM
zzzzzzzzzzzzzzzzz
答案 2 :(得分:0)
类似于Jotnes的回答取代了该领域。
awk '!/08/||$1=$1*2' file
使用shell中的变量
var=2;awk '!/08/||$1=$1*'"$var" file
如果只是需要改变的第三行
var=2;awk 'NR!=3||$1=$1*'"$var" file