我有一个脚本从输入文件中获取最后一行,并迭代地将定义的“step”值添加到行中的某些数据字段。外部循环将“step”添加到第一个数据字段,嵌套的内部循环将“step”添加到第二个数据字段。然后,旧数据字段值将替换为新值,新行将回显到我的命令行(仅用于此论坛的目的)。最后,我将旧输入文件中的数据复制到新文件中,删除最后一行,然后追加新的最后一行。
#!/bin/bash
step=0.1
inputfile=$1
limit_i=2
limit_j=2
lastline=$(awk END{print}<$inputfile)
x0=$(echo "$lastline" | awk '{print $1}')
y0=$(echo "$lastline" | awk '{print $2}')
for (( i=0; i <= $limit_i; i++))
do
istep=$(echo "$i*$step" | bc)
xnew=$(echo "$x0 $istep" | awk '{printf "%.16f", $1+$2}')
lastline_new_x=${lastline/$x0/$xnew}
for (( j=0; j <= $limit_j; j++))
do
jstep=$(echo "$j*$step" | bc)
ynew=$(echo "$y0 $jstep" | awk '{printf "%.16f", $1+$2}')
lastline_new_xy=${lastline_new_x/$y0/$ynew}
echo "$lastline_new_xy"
done
done
以下是我对此脚本的期望输出:
0.0000000000000000 0.0000000000000000 1.2000000000000000 T T T
0.0000000000000000 0.1000000000000000 1.2000000000000000 T T T
0.0000000000000000 0.2000000000000000 1.2000000000000000 T T T
0.1000000000000000 0.0000000000000000 1.2000000000000000 T T T
0.1000000000000000 0.1000000000000000 1.2000000000000000 T T T
0.1000000000000000 0.2000000000000000 1.2000000000000000 T T T
0.2000000000000000 0.0000000000000000 1.2000000000000000 T T T
0.2000000000000000 0.1000000000000000 1.2000000000000000 T T T
0.2000000000000000 0.2000000000000000 1.2000000000000000 T T T
然而,实际输出是:
0.0000000000000000 0.0000000000000000 1.2000000000000000 T T T
0.1000000000000000 0.0000000000000000 1.2000000000000000 T T T
0.2000000000000000 0.0000000000000000 1.2000000000000000 T T T
0.1000000000000000 0.0000000000000000 1.2000000000000000 T T T
0.1000000000000000 0.1000000000000000 1.2000000000000000 T T T
0.1000000000000000 0.2000000000000000 1.2000000000000000 T T T
0.2000000000000000 0.0000000000000000 1.2000000000000000 T T T
0.2000000000000000 0.1000000000000000 1.2000000000000000 T T T
0.2000000000000000 0.2000000000000000 1.2000000000000000 T T T
第4 - 9行对我来说很好看。第1行在技术上看起来也很好,但我相信同样的问题影响2&amp; 3也正在影响它。看起来由于某种原因,对于第一次传递,外部循环不保持其值并允许内部循环完全通过,而是迭代并保持内部循环值。我做了很多谷歌搜索并与一些人交谈,但无法弄清楚这是什么bug。我现在已经坚持了一段时间,并且非常感谢任何解决方案的建议。
答案 0 :(得分:0)
第二个输出行的错误(与第三个输出行类似)是
lastline_new_xy=${lastline_new_x/$y0/$ynew}
您希望将第二个数据字段(y0
,0.0000000000000000
)替换为ynew
(0.1000000000000000
),但由于第一个数据字段也是{{ 1}}和0.0000000000000000
模式替换只替换第一个匹配,你得到
${parameter/pattern/string}
而不是
0.1000000000000000 0.0000000000000000 1.2000000000000000 T T T
有无数种方法可以解决这个问题,但最重要的是将上面的脚本行更改为
0.0000000000000000 0.1000000000000000 1.2000000000000000 T T T