我想在文件'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,但是尽管我尝试了,我还是没有成功地用新的行代替旧的行。
任何想法?谢谢!
您需要向前走到下一行,否则将执行以下包含print
语句的块。像这样使用next
:
/0.08/ {printf " %.2f %.2f %.2f %.2f %.2f %sn",
$1*var, $2*var, $3*var, $4*var, $5*var, $6; next}
Btw, awk
是正确的工具。没有(合理的)方法可以用sed实现这一点,因为sed不支持数学操作。
还要注意,有多种方法可以实现这一点。
您可以直接替换字段:
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
类似于琼斯的回答替换字段。
awk '!/08/||$1=$1*2' file
使用shell
中的变量var=2;awk '!/08/||$1=$1*'"$var" file
如果只有第三行需要修改
var=2;awk 'NR!=3||$1=$1*'"$var" file