我有一个文件(一个知道它是什么的坐标文件),如下所示:
#! /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只是消失或至少被空白取代。
有什么建议吗?
非常感谢, 皮埃尔 - 路易斯
答案 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