2015-01-26 2 views
1

Скажем, у вас есть (многострочный) здесь строку с именем $cnt:Разбивает строку и передать отдельные строки в цикл в Баш

Foo 
X 
Y 
Z 
Foo 
A 
B 
C 
D 

Одна строка может регулярное выражение в несколько plarts с awk следующим образом:

awk '/Foo/{i++}{print > "dat"i}' <<<"$cnt" 

в результате большое количество файлов dat1, dat2 ...

Но другая часть s строки должны быть обработаны с помощью дополнительных команд, так можно, конечно, определить for цикл:

for f in "dat*" 
do 
    #commands to process $f file 
done 

Файлы, однако, не является хорошим решением для промежуточных результатов, так как они медленно, глобальные (они могут взаимодействовать с другими файлы), используйте больше памяти (поскольку все файлы сгенерированы первыми, тогда как итеративный подход может повторно использовать память, выпущенную после обработки предыдущего фрагмента), ... Поэтому было бы лучше, если бы обрабатывать экземпляры как переменные. Есть ли удобный способ сделать это.

Обратите внимание, что различные детали могут содержать новые линии, поэтому недостаточно для линий read.

Первый срез для процесса, таким образом:

Foo 
X 
Y 
Z 

Второй срез должен быть:

Foo 
A 
B 
C 
D 

ответ

1

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

awk '/Foo/{i++; if (cmd){close(cmd); cmd="whatever command you need"}{print | cmd}' <<<"$cnt" 

Можно разделить входной сигнал и использовать \0 для разделения сегментов и трубы к xargs -0 -n 1 whatever command и т.д.

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

while IFS= read -r line; do 
    if [ "$line" = "$sentinel" ]; then 
     if [ -n "$acc" ]; then 
      whatever command "$acc" 
     fi 
     acc="" 
    fi 
    acc+="$line"$'\n' 
done <<<"$cnt" 
Смежные вопросы