用另一个文件替换文件中的值(bash / awk)

时间:2018-04-04 18:03:50

标签: bash awk

我有一个文件(一个知道它是什么的坐标文件),如下所示:

#! /bin/bash

a=0;

for ((i=0; i<=10 (for example); i++)); do

awk '{if ((NR==2) && ($5=="1.60000")) {($5=a)} print $0 }' file.dat > ${i}_file.dat

a=$((a+0.05))

done

等等。我的想法是使用for循环替换第二行中的值“1.60000”,其他值。

我希望值从0开始,例如0,然后停在2.0,增量步长为0.05

这是我已经尝试过的:

{$5=a}

但是,遗憾的是它不起作用。我为 1 C 1 2 C 1 1 3 H 5 1 1.10000 2 109.4700 4 H 5 1 1.10000 2 109.4700 3 109.4700 1 声明尝试了很多组合但没有确定的结果。

这是我获得的:

debugserver

值1.6000只是消失或至少被空白取代。

有什么建议吗?

非常感谢, 皮埃尔 - 路易斯

2 个答案:

答案 0 :(得分:0)

或许sed是一个更好的选择

$ v=0.00; for((i=0; i<=40; i++)) do 
     sed '2s/1.60/'"$v"'/' file > file_"$i"; 
     v=$(echo "$v + 0.05" | bc | xargs printf "%.2f\n"); 
  done

<强>解释

  
    

sed '2s/1.60/'"$v"'/' file使用变量1.60

的值更改第二行的值v          

bash中的浮点算法很难,这会为值添加0.05并对其进行格式化(0.05而不是.05),这样我们就可以在{{{}}的替换中使用它1}}。

  

锻炼:在sed中尝试将bash添加到0.05,并将输出格式化为0.05,前导零。

答案 1 :(得分:0)

示例使用awk (glenn的建议)

for ((i=0; i<=10; i++)); do
    awk -v "i=$i" '
        (FNR==2){ $5=sprintf("%2.1f ",i*0.5); print $0 }
    ' file.dat # > $i_file.dat # uncomment for a file output
done

优点:管理浮点运算的awk