Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用另一个值替换文件中的值(bash/awk)_Bash_Awk - Fatal编程技术网

用另一个值替换文件中的值(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