Используя awk (или sed) для удаления новых строк на основе первого символа следующей строки

вот моя ситуация: у Меня был большой текстовый файл, от которого я хотел вытянуть определенную информацию. Я использовал sed для получения по запросу всей релевантной информации на основе regexp's, но каждая "часть" информации, которую я вытянул, находится на отдельной строке, я хотел бы за каждую "запись" быть на ее собственной строке, таким образом, это может быть легко импортировано в DB.
Вот образец моих данных прямо сейчас:

92831,499,000
, 0644321
79217,999,000
, 5417178
, PK91622
, PK90755

Идеально, я хотел бы, чтобы этот вывод был похож:

92831,499,000, 0644321
79217,999,000, 5417178, PK91622
79217,999,000, 5417178, PK90755

Это может быть более трудно сделать, таким образом, я согласился бы на вывод той последней "записи", чтобы только казаться, однажды с дополнительным "PK..." быть 4-м "полем" той строки.
В конце самый простой способ, которым я мог думать о выполнении, состоит в том, если строка запускается с запятой (^), новая строка, прежде чем это должно будет быть удалено... Я не слишком знаком с awk, хотя поэтому, если бы Вы могли бы дать мне запуск на этом, он действительно ценился бы!Спасибо!

8
задан Paused until further notice. 5 February 2010 в 16:19
поделиться

4 ответа

Ну, думаю, мне стоило присмотреться к использованию Records in awk, когда я пытался разобраться в этом прошлой ночью... Через 10 минут после того, как я посмотрел на них, я заставил их работать. Для всех, кого это интересует, вот как я это сделал: В моем оригинальном скрипте sed я поставил дополнительную новую строку перед началом каждой записи, так что теперь есть пустая строка, разделяющая каждую. Затем я использую следующую команду awk:

awk 'BEGIN {RS = ""; FS = "\n"}
. {
если (NF >= 3)
для (i = 3; i <= NF; i++)
напечатайте $1,2,$i
}

и это работает как очарование, выдающее именно то, что я хотел!

2
ответ дан 5 December 2019 в 15:23
поделиться

Без специального поля 3, легко.

awk '
    !/^,/   { if (NR > 1) print x ; x = $0 }
    /^,/    { x = x OFS $0 }
    END     { if (NR) print x }
'

С, более сложным, но все же не слишком сложным.

awk '
    !/^,/   { if (n && n < 3) print x ; x = $0 ; n = 1 }
    /^,/    { if (++n > 2) { print x, $0 } else { x = x OFS $0 } }
    END     { if (n && n < 3) print x }
'
1
ответ дан 5 December 2019 в 15:23
поделиться
$ perl -0pe 's/\n,/,/g' < test.dat
92831,499,000,0644321
79217,999,000,5417178,PK91622,PK90755

Перевод: читать сразу без разделения строк, заменяя каждую запятую после новой строки только запятой.

Самый короткий код здесь!

6
ответ дан 5 December 2019 в 15:23
поделиться
sedsed -d -n ':t;/^,/!x;H;n;/^,/{x;$!bt;x;H};x;s/\n//g;p;${x;/^,/!p}' filename
1
ответ дан 5 December 2019 в 15:23
поделиться