2013-12-10 93 views
1

我正在尝试使用名为uvspec的基于终端的程序来运行大量计算(仅超过200万)的Bash脚本。但我已经打了以下的最新计算的严重障碍......BASH脚本条件语句问题

脚本,打开它有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语句执行此操作...问题是一些可怕的错误是从我的输出中提取出来的,米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 
+1

你能否具体谈谈是什么问题?你指的是'x.inp'包含8个'x.template'的副本吗?这是因为您为每个sed指定了两次 –

+0

基本上,每条线都对应于经度,纬度图上的特定位置。第四列的高度为整数公里。 -9999的高度对应于海洋。当我在输入文件中绘制高度时,我会得到非常准确的世界地图。我希望我的脚本所做的是为每个位置返回“0 -9999”,而不用打扰计算,但是当我绘制输出文件时,-9999s混乱起来,绝不会像世界地图! – fred

回答

2

桑达可以做所有三个换人一气呵成,你可以通过管道输出直接进入你的分析程序,而无需创建任何中间a.template和b.template文件...

sed -e "s/.../.../" -e "s/.../.../" -e "s/.../.../" x.template | ../bin/uvspec 

通过顺便说一下,你也可以摆脱“猫”的开始,并与变量,其名称替换您的阵列更好地匹配它们是什么,如果你使用一个循环是这样的:

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” - 因此我不太确定您的参数是什么,但是您应该希望从上面的例子中得到想法。

+0

好啊。队友的欢呼声! – fred

+0

@shellter您会注意到,每个不同的文件都是由sed命令生成的。 –

+0

如果能为您解决问题,您是否可以接受我的答案,并带上可爱的大绿色勾号?或者只是说如果你仍然有问题,需要进一步的帮助。 –

0

您可能希望那些“sed的”线条组合成更多的东西一样:

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