2014-01-08 41 views
0

我想創建一個腳本,以便將文件分解爲24.「infoband.dat」包含我想繪製的24個樂隊的數據,但不是分別寫每個樂隊,它首先寫出每個樂隊的所有第一點,然後是所有第二點,等等。 我的腳本應該開始讀取文件的每一行,而一次數到24,直到文件結尾。在for循環的第一次迭代中,它將創建一個文件,其中包含所有24行塊中的所有第一行,並且它可以成功完成。但第二次迭代甚至沒有開始。什麼是打破循環?bash腳本:for循環中斷第一次迭代沒有解釋

1 #!/bin/sh 
    2 grep frequency band.yaml > infoband.dat 
    3 contadora=0 
    4 for i in {1..24} #loop to create the band file, 24 is the no. of bands 
    5 do 
    6 contadora=$((contadora+1)) 
    7 contadorb=0 
    8 contadorc=0 
    9 while read line 
10  do 
11   contadorb=$((contadorb+1)) 
12   if [ $contadorb -eq 25 ] 
13   then 
14    contadorb=1 
15    contadorc=$((contadorc+1)) 
16   fi 
19   if [ $contadora -eq $contadorb ] 
20   then 
21    echo $contadora $contadorb $contadorc "$line" >> band_$contadora.dat 
22   fi 
23  done < infoband.dat 
24 echo "file of the band " $contadora "is finished" 
25 done 

更新:我使用了不同的方法完成的代碼(變量contadorc是沒用的BTW):

1 #!/bin/sh 
    2 grep frequency band.yaml > infoband.dat 
    3 nband=24 
    4 contadorb=0 
    5 contadorc=0 
    6 while read line 
    7 do 
    8 contadorb=$((contadorb+1)) 
    9 if [ $contadorb -eq $((nband+1)) ] 
10 then 
11  contadorb=1 
12  contadorc=$((contadorc+1)) 
13 fi 
14 echo " "$contadorb" "$line" punto_q $contadorc">> test_infoband.dat 
15 done < infoband.dat 
16 for i in `seq 1 $nband` 
17 do 
18 echo $i $nband 
19 grep " $i " test_infoband.dat > banda_$i.dat 
20 done 
+0

我只是想到了一種解決方法...雖然我很想知道爲什麼這個循環不起作用。 –

+0

你不需要重新設置contradora,否則第19行將有像第25,26,27 ....第一個循環後的值。祝你好運。 – shellter

回答

0

/bin/sh不做括號擴展,讓你的循環只有一次迭代,其中i被設置爲字符串{1..24}。無論是主題標籤更改爲/bin/bash和/或與bash運行腳本,或者使用

for i in $(seq 1 24) 

(假設你的系統有seq命令,否則,你可能只是需要硬編碼的列表,或使用while循環明確增加和測試i的值)。

+0

這樣做!謝謝! –

0

您是否嘗試過使用命令「分裂」?

分裂-l 24 infoband.dat

+0

我會,但問題是,infoband文件具有如下數據: 行我想要的第一個文件 線我想要的第二個文件 。 。 我想要第24個文件的線 我想要的第1個文件的線 ... –

+0

感謝,實際上您的評論讓我想到了一個解決方法:在我的腳本中,我一直在創建一個測試文件,應該重現infoband的每一行,看它是否正確讀取。在你說我意識到我可以在每一行輸入樂隊的號碼,然後單獨grep他們,現在行有標識符。 –