AWK读取文件,对某些行的几列进行操作,并打印执行更改的所有文件



我想在文件'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不支持数学操作。

还要注意,有多种方法可以实现这一点。

请查看@Jotne的答案。

您可以直接替换字段:

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

最新更新