У меня есть свободно структурированные записи в файле, состоящем из трех или четырех строк текста, разделенных (в основном) пустым. Не все записи имеют пустой разделитель строк, но последняя строка каждого начинается со слова «Добавлено». Я хотел бы создать файл csv с каждой записью на одной строке, которой предшествует номер строки. До сих пор мне удалось создать конкатенацию всех записей, разделенных произвольным количеством пробелов и избыточной запятой.
Логически я пытаюсь добиться следующего:
Читать line, если строка начинается «Добавлена» сохранить новую строку в конце else заменить «newline» на «,» или если строка пуста, удалите ее endifПример данных:
Peter Green
Space Monkey at Area 51
Joined
Added by SF 3 weeks ago
Will Rossiter
Joined
Added by SF 3 weeks ago
Dean Matthews
Guitarist at Blues
Joined
Added by SF 3 weeks ago
Hobbit Mak
Farnborough, United Kingdom
Joined
Added by SF 3 weeks ago
Keneth W Moorfield
THE STOREMAN
Joined
Added by SF 3 weeks ago
Mick Georgious
Software Engineer
Joined
Added by SF 3 weeks ago
Вот возможное решение sed (с awk делать нумерацию строк):
$ sed -n -e :a -e '$!{/^$/!N}; /,Added/ {P;D}; s/\n/,/; ta' data | awk '{print NR","$0}'
1,Peter Green,Space Monkey at Area 51,Joined,Added by SF 3 weeks ago
2,Will Rossiter,Joined,Added by SF 3 weeks ago
3,Dean Matthews,Guitarist at Blues,Joined,Added by SF 3 weeks ago
4,Hobbit Mak,Farnborough, United Kingdom,Joined,Added by SF 3 weeks ago
5,Keneth W Moorfield,THE STOREMAN,Joined,Added by SF 3 weeks ago
6,Mick Georgious,Software Engineer,Joined,Added by SF 3 weeks ago
В основном мы просто продолжаем добавлять непустые строки ввода и заменяем их новые строки запятыми, за исключением того, что мы проверяем на каждой итерации, чтобы увидеть, есть ли у нас целая запись, и если мы это сделаем, выплюнуть, т. е.
установить метку программы :a, если не в конце файла $!, а затем добавить не -пустые строки в пространство паттерна {/^$/!N}, если мы находимся в конце записи /,Added/, затем напечатаем его P и удалим его D из запятой запятой пространства рисунка для строки s/,/\n/, отведя назад [ f11] по успехуFWIW, вот опция perl:
$ perl -lne '
push @rec, $_ unless /^$/; if (/^Added/) {print join ",", ++$n, @rec; undef @rec;}
' data
1,Peter Green,Space Monkey at Area 51,Joined,Added by SF 3 weeks ago
2,Will Rossiter,Joined,Added by SF 3 weeks ago
3,Dean Matthews,Guitarist at Blues,Joined,Added by SF 3 weeks ago
4,Hobbit Mak,Farnborough, United Kingdom,Joined,Added by SF 3 weeks ago
5,Keneth W Moorfield,THE STOREMAN,Joined,Added by SF 3 weeks ago
6,Mick Georgious,Software Engineer,Joined,Added by SF 3 weeks ago