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

Я свободно структурировал записи в файле, состоящем из или 3 или 4 строк текста, разделенного (главным образом) пустой строкой. Не все записи имеют разделитель пустой строки, но последняя строка каждого запускается со слова "Added". Я хотел бы произвести файл CSV с каждой записью на одной строке, которой предшествует ее номер строки. До сих пор я только смог произвести конкатенацию всех записей, разделенных произвольным числом пробелов и избыточной запятой.

Логически я пытаюсь достигнуть следующего:

Считайте строку, если строка запускается 'Добавленный', сохраняют новую строку в конце
еще замените 'новую строку''',
или если строка является пробелом, удаляют его
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
4
задан 5 August 2016 в 23:06

3 ответа

Попытка:

awk '/./{ printf "%s%s", $0, (/Added/?"\n":",") }' data

Используя Ваши демонстрационные входные данные:

$ awk '/./{printf "%s%s",$0,(/Added/?"\n":",")}' data
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

Как это работает:

  • /./{...}

    Это выполняет команды в фигурных скобках, только если строка содержит символ. Другими словами, это игнорирует пустые строки.

  • printf "%s%s",$0,(/Added/?"\n":",")

    Это печатает строку, обозначенную $0, сопровождаемый или запятой или новой строкой в зависимости от того, соответствует ли строка regex Added.

5
ответ дан 1 December 2019 в 08:59

Вот возможное 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/, переходя назад к a на успехе
3
ответ дан 1 December 2019 в 08:59

FWIW, вот a 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
ответ дан 1 December 2019 в 08:59

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

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