Ручная итерация строки файла | удар - PullRequest
8 голосов
/ 21 сентября 2009

Я мог бы сделать это на любом другом языке, но с помощью Bash я посмотрел повсюду и не смог найти ответ.

Мне нужно вручную увеличить $line в скрипте. Пример:

for line in `cat file`
do
foo()
       foo_loop(condition)
{
 do_something_to_line($line) 
}
done

Если вы заметили, что каждый раз, когда foo_loop повторяется, $line остается неизменным. Мне нужно перебрать $line и убедиться, что в исходном цикле for выполняется только количество строк в файле.

Я думал о том, чтобы найти число строк в файле с помощью другого цикла и перебрать переменную строки во внутреннем цикле foo().

Есть идеи?

EDIT:

Извините, что вы так расплывчаты.

Вот и мы:

Я пытаюсь заставить часть моего кода выполняться несколько раз (параллельное выполнение)

Function foo() # Does something
for line in `cat $temp_file`;
foo($line)

Этот код работает просто отлично, потому что foo просто принимает значение строки; но если бы я хотел сделать это:

Function foo() # Does something
for line in `cat $temp_file`;
while (some condition)
foo($line)
end

$line будет равно одному значению во всем цикле while. Мне нужно, чтобы он изменился в цикле while, затем продолжите, когда он вернется к for. Пример: * * тысяча тридцать пять

line = Hi
foo{ echo "$line" }; 
for line in `cat file`;
while ( number_of_processes_running -lt max_number_allowed)
foo($line)
end

Если содержимое файла было

Hi \n Bye \n Yellow \n Green \n

Вывод примера программы будет (если максимально допустимое число было 3)

Hi Hi Hi Bye Bye Bye Yellow Yellow Yellow Green Green Green.

Где я хочу, чтобы это было

Hi Bye Yellow Green 

Надеюсь, так лучше. Я делаю все возможное, чтобы объяснить мою проблему.

Ответы [ 3 ]

16 голосов
/ 22 сентября 2009

Вместо того, чтобы использовать цикл for для чтения файла, возможно, вам следует прочитать файл следующим образом.

#!bin/bash

while read line
do
    do_something_to_line($line)
done < "your.file"
6 голосов
/ 22 сентября 2009

Короче говоря, while read line; do _____ ; done

Затем убедитесь, что у вас есть двойные кавычки вокруг "$ line", чтобы параметр не разделялся пробелами.

Пример:

$ cat /proc/cpuinfo | md5sum
c2eb5696e59948852f66a82993016e5a *-

$ cat /proc/cpuinfo | while read line; do echo "$line"; done | md5sum
c2eb5696e59948852f66a82993016e5a *-

Второй пример # добавить .gz к каждому файлу в текущем каталоге: # Если в каких-либо файлах есть пробелы, команда mv для этой строки выдаст ошибку.

$ find -type f -maxdepth 1 | while read line; do mv "$line" "$line.gz"; done
1 голос
/ 22 сентября 2009

Вы должны публиковать последующие материалы в виде изменений к вашему вопросу или в комментариях, а не в качестве ответа.

Эта структура:

while read line
do
    for (( i=1; i<$max_number_allowed; i++ ))
    do
        foo $line
    done
done < file

Урожайность:

Hi
Hi
Hi
Bye
Bye
Bye
...etc.

Пока этот:

for (( i=1; i<$max_number_allowed; i++ ))
do
    while read line
    do
        foo $line
    done < file
done

Урожайность:

Hi
Bye
Yellow
Green
Hi
Bye
Yellow
Green
...etc.
...