BASH脚本条件语句问题

BASH脚本条件语句问题,bash,shell,conditional-statements,Bash,Shell,Conditional Statements,我正在尝试使用一个名为uvspec的基于终端的程序,使用Bash脚本运行大量计算(刚刚超过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 ... while IFS=S' ' read tau sza alt p4 do echo $tau $sza

我正在尝试使用一个名为uvspec的基于终端的程序,使用Bash脚本运行大量计算(刚刚超过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
...
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
这些值中的每一个都代表一个不同的值,我想将其替换到输入文件中(使用sed),因此我将每一行读入一个数组。其中许多行在第4列中包含负值,例如-9999,这会导致程序中出现错误,因此我想省略这些行并返回一个标准输出-我正在使用if语句执行此操作。。。问题是我的输出中出现了严重错误,我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
cat“../Maps/dniinput”|而IFS=$''read-r-a myArray
做
如果[“${myArray[3]}”-gt 0]
然后
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>dni.out
其他的
回音“0-9999”>>dnijul.out
fi
完成

Sed可以一次性完成所有三个替换,您可以将输出直接导入分析程序,而无需创建任何中间a.template和b.template文件

sed -e "s/.../.../" -e "s/.../.../" -e "s/.../.../" x.template | ../bin/uvspec
顺便说一句,如果使用这样的循环,您还可以在开始时去掉“cat”,用名称更匹配的变量替换数组:

0 66.3426 -9.999 -9999
0 66.6192 -9.999 -9999
0 61.9212 1.655 1655
0 61.9999 1.655 1655
...
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
当IFS=S''读取tau sza alt p4时
做
回声$tau$sza$alt$p4
完成

我将第四个元素命名为“p4”,因为您在注释中将第四个元素称为海拔高度,但在代码中,您将“ALT”替换为第三列-因此我不确定您的参数是什么,但希望您能从上面的示例中了解到这一点。

您可能希望将这些“sed”组合起来将线条分成更像:

 sed -e "s/TAU/${myArray[0]}/" -e "s/SZA/${myArray[1]}/" \
     -e "s/ALT/${myArray[2]}/" < x.template \
   | ../bin/uvspec >> dni.out
sed-e“s/TAU/${myArray[0]}/”-e“s/SZA/${myArray[1]}/”\
-e“s/ALT/${myArray[2]}/”>dni.out

您能否更具体地说明问题所在?您是指
x.inp
包含8份
x.template
?这是因为您为每条线指定了两次,基本上每条线都对应于经纬度图形上的特定位置。第四列将海拔高度表示为整数km。海拔-9999相当于海洋。当我在输入文件中绘制高度时,我得到了一张非常精确的世界陆地地图。我想让我的脚本为每个位置返回“0-9999”,而不必费心计算,但是当我绘制输出文件时,-9999是混乱的,根本不像世界地图!啊,很好。干杯,伙计@Sheller你会注意到每一个不同的文件都是由sed命令在它之前生成的。你能接受我的答案吗?如果它适合你的话,用一个可爱的绿色大勾号?或者说,如果你仍然有问题,需要进一步的帮助。