用另一个值替换文件中的值(bash/awk)
我有一个文件(对于那些知道它是什么的人来说是一个坐标文件),如下所示:用另一个值替换文件中的值(bash/awk),bash,awk,Bash,Awk,我有一个文件(对于那些知道它是什么的人来说是一个坐标文件),如下所示: 1 C 1 2 C 1 1 1.60000 3 H 5 1 1.10000 2 109.4700 4 H 5 1 1.10000 2 109.4700 3 109.4700 1 等等。。我的想法是使用for循环将第二行中的值“1.60000”替换为其他值 我希望该值以0开始,以2.0停止
1 C 1
2 C 1 1 1.60000
3 H 5 1 1.10000 2 109.4700
4 H 5 1 1.10000 2 109.4700 3 109.4700 1
等等。。我的想法是使用for循环将第二行中的值“1.60000”替换为其他值
我希望该值以0开始,以2.0停止,例如,增量步长为0.05
以下是我已经尝试过的:
#! /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
值1.6000只是消失或至少被空白替换
有什么建议吗
非常感谢,
皮埃尔·路易斯(Pierre Louis)因此,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
$v=0.00;对于((i=0;i文件“$i”;
v=$(echo“$v+0.05”| bc | xargs printf”%.2f\n);
完成
解释
sed'2s/1.60/'“$v”/”文件
使用变量v
bash中的浮点算法很难实现,这会向值中添加0.05
,并对其进行格式化(0.05
,而不是.05
),以便我们可以使用它替换sed
给你的练习:在bash
中,尝试将0.05
添加到0.05
中,并将输出格式化为带前导零的0.10
。awk示例(glenn的建议)
for((i=0;i$i_file.dat)取消对文件输出的注释
完成
优点:是awk管理浮点运算欢迎使用SO,请在您的帖子中使用代码标记附加示例输出。Hello@RavinderSingh13,刚刚编辑了我的帖子:)bash根本不支持浮点运算,只支持整数您需要显式地将shell变量传递给awk:
awk-v“a=$a”…
--这样,您就有了一个awk变量“a”,它的值与shell变量“$a”的值相同。它确实起作用了!我对Perl、Sed、awk非常陌生……所以我还不了解所有内容。您能简单解释一下代码的最后一行吗?但非常感谢:)别担心,没有人了解所有内容!
$ 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
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