Создание csv из непоследовательного текстового файла

У меня есть свободно структурированные записи в файле, состоящем из трех или четырех строк текста, разделенных (в основном) пустым. Не все записи имеют пустой разделитель строк, но последняя строка каждого начинается со слова «Добавлено». Я хотел бы создать файл 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
1
задан 5 August 2016 в 23:06

2 ответа

Вот возможное решение 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] по успеху
3
ответ дан 23 May 2018 в 07:25
  • 1
    RTFM RTFM Направляйтесь вниз и исследуйте, как вы использовали sed - впечатляет, спасибо @steeldriver – SeniorMoments 5 August 2016 в 22:37
  • 2
    @SeniorMoments спасибо - мне нравится исследовать его пыльные углы;) – steeldriver 5 August 2016 в 23:05

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 
2
ответ дан 23 May 2018 в 07:25

Другие вопросы по тегам:

Похожие вопросы: