Я свободно структурировал записи в файле, состоящем из или 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
Попытка:
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
.
Вот возможное 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
на успехе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