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

时间:2014-07-25 08:05:53

标签: bash 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的内容,但是尽管我尝试过,但我没有成功地用新的替换旧行。

有什么想法吗?谢谢!

3 个答案:

答案 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