2013-12-10 133 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