2014-01-08 3 views
0

Я пытаюсь создать скрипт, чтобы разбить файл на 24. «infoband.dat» содержит данные из 24 полос, которые я хочу построить, но вместо того, чтобы записывать каждую группу по отдельности, она сначала записывает все 1-ю точки каждой полосы, затем все 2-е и т. д. . Мой скрипт должен был начинать читать каждую строку файла, в то время как считать 24 снова и снова до тех пор, пока конец файла. На первой итерации цикла for он создаст файл со всеми первыми строками из этих 24 строк строки, и он сделает это успешно. Но вторая итерация даже не начинается. Что нарушает цикл?bash script: для перерывов цикла на первой итерации без объяснения причин

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 бесполезно кстати):

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

Вам не нужно перезаписывать противоречие, иначе строка 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

Спасибо, на самом деле ваш комментарий заставлял меня думать об обходном пути: в моем сценарии я создавал тестовый файл, который должен воспроизводить каждую строку информации , чтобы убедиться, что он правильно читает. После того, как вы сказали, что я понял, что могу набирать номер группы на каждой строке, а затем grep их отдельно, теперь, когда строки имеют этот идентификатор. –

Смежные вопросы