我正在尝试使用Bash脚本使用名为uvspec的基于终端的程序运行大量计算(仅超过200万)。但是,在计算的最新成绩之后,我遇到了严重障碍......
该脚本打开一个输入文件,其中包含2e ^ 6行,如下所示:
0 66.3426 -9.999 -9999
0 66.6192 -9.999 -9999
0 61.9212 1.655 1655
0 61.9999 1.655 1655
...
这些值中的每一个代表我想要替换到输入文件中的不同值(使用 sed ),因此我将每行读入数组。这些行中的许多行在第4列中包含负值,例如-9999,这会导致程序出错,所以我想省略那些行并返回一个标准输出 - 我用if语句做这个...问题是我的输出中出现了一个非常错误的问题我m 99.9%确定问题是以下脚本中的错误,因为我对bash相当新。
任何人都可以在这里发现任何没有意义或语法错误的内容吗?
对脚本的任何评论一般也都是有用的反馈。
cat ".../Maps/dniinput" | while IFS=$' ' read -r -a myArray
do
if [ "${myArray[3]}" -gt 0 ]
then
sed s/TAU/"${myArray[0]}"/ x.template x.template > a.template
sed s/SZA/"${myArray[1]}"/ a.template a.template > b.template
sed s/ALT/"${myArray[2]}"/ b.template b.template > x.inp
../bin/uvspec < x.inp >> dni.out
else
echo "0 -9999" >> dnijul.out
fi
done
答案 0 :(得分:2)
Sed可以一次完成所有三个替换,您可以将输出直接输入到分析程序中,而无需创建任何中间的a.template和b.template文件......
sed -e "s/.../.../" -e "s/.../.../" -e "s/.../.../" x.template | ../bin/uvspec
顺便说一句,你也可以在开始时摆脱“cat”,并用你的名字更符合它们的变量替换你的数组,如果你使用这样的循环:
while IFS=S' ' read tau sza alt p4
do
echo $tau $sza $alt $p4
done < a
0 66.3426 -9.999 -9999
0 66.6192 -9.999 -9999
0 61.9212 1.655 1655
0 61.9999 1.655 1655
我将第四个元素命名为“p4”,因为您将第四个元素称为注释中的高度,但在您的代码中,您将第三列替换为“ALT” - 所以我不确定您的参数是什么是的,但你应该从上面的例子中得到这个想法。
答案 1 :(得分:0)
您可能希望将这些“sed”行组合成更像:
sed -e "s/TAU/${myArray[0]}/" -e "s/SZA/${myArray[1]}/" \
-e "s/ALT/${myArray[2]}/" < x.template \
| ../bin/uvspec >> dni.out