2013-11-26 3 views
0

Допустим, у вас есть следующий входной файлSplit файла многократным линии ломает

Some text. It may contain line 
breaks. 

Some other part of the text 

Yet an other part of 
the text 

И вы хотите перебрать каждую часть текста (разделенные двумя переносами строки (\n\n)), так что в первой итерации Я хотел бы только получить:

Some text. It may contain line 
breaks. 

Во второй итерации я хотел бы получить:

Some other part of the text 

И в последней итерации я хотел бы получить:

Yet an other part of 
the text 

Я попробовал это, но это, кажется, не работает, потому что IFS поддерживает только один символ?

cat $inputfile | while IFS=$'\n\n' read part; do 
    # do something with $part 
done 

ответ

1

Это является решением анубхава в чистом Баш:

#!/bin/bash 

COUNT=1; echo -n "$COUNT: " 
while read LINE 
do 
    [ "$LINE" ] && echo "$LINE" || { ((++COUNT)); echo -n "$COUNT: " ;} 
done 
+0

В результате я использовал вариант (без COUNT), потому что у меня были проблемы с выходом с awk-решением. В моих текстовых частях было много символов, таких как '' 'или' '', и их нужно было передать другому скрипту через вызов 'system()'. – MarcDefiant

2

Использование AWK с нулевым RS:

awk '{print NR ":", $0}' RS= file 
1: Some Text. It may contains line 
breaks. 
2: Some Other Part of the Text 
3: Yet an other Part of 
the Text 

Вы можете ясно видеть, что ваш входной файл имеет 3 записи сейчас (каждая запись выводится с записью # на выходе).

+0

Как я могу выполнить пошаговый с 'while' или' for' петли, как показано в этом вопросе? – MarcDefiant

+0

С 'awk' вам не нужно итерации в цикле, так как awk обрабатывает запись записи по записи. Вы можете что угодно с каждой записью (обозначенной «$ 0»), и файл должен быть повторен awk – anubhava

+1

oops, не видел вашего ответа ... отправил a dup ... :(+1 и удалил мой. – Kent

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