Объединить несколько строк в один (.cap файл) CentOS - PullRequest
0 голосов
/ 17 сентября 2018

Одна запись имеет несколько строк. Каждая запись разделена двумя пустыми строками. Каждая запись должна быть заключена в одну строку, за которой следует разделитель (;).

Пример ввода:

Name:Sid
ID:123


Name:Jai
ID:234


Name:Arun
ID:12

Попытка замены пустых строк на cat test.cap | tr -s [:space:] ';'

Выход:

Name:Sid;ID:123;Name:Jai;ID:234;Name:Arun;ID:12;

Ожидаемый результат:

Name:SidID:123;Name:JaiID:234;Name:ArunID:12;

То же самое имеет место с Xargs.

Я также использовал команду sed, но она объединяла только две строки в одну. Где у меня 132 строки в одной записи и 1000 таких записей в одном файле.

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Вы можете использовать

cat file | awk  'BEGIN { FS = "\n"; RS = "\n\n"; ORS=";" } { gsub(/\n/, "", $0); print }' | sed 's/;;*$//' > output.file

Вывод:

Name:SidID:123;Name:JaiID:234;Name:ArunID:12

Примечания:

  • FS = "\n" установит разделители полей на новую строку`
  • RS = "\n\n" установит для ваших разделителей записей двойной перевод новой строки
  • gsub(/\n/, "", $0) удалит все новые строки из найденной записи
  • sed 's/;;*$//' удалит завершающий ;, добавленныйawk

См. онлайн-демонстрацию

0 голосов
/ 17 сентября 2018

Это может сработать для вас (GNU sed):

sed -r '/./{N;s/\n//;H};$!d;x;s/.//;s/\n|$/;/g' file

Если это не пустая строка, добавьте следующую строку и удалите новую строку между ними. Добавьте результат в область удержания и, если это не конец файла, удалите текущую строку. В конце файла поменяйте местами пробел, удалите первый символ (который будет новой строкой), а затем замените все новые строки (добавьте дополнительную точку с запятой только для последней строки) точкой с запятой.

0 голосов
/ 17 сентября 2018

Не могли бы вы попробовать следующее.

awk 'NF{val=(val?$0~/^ID/?val $0";":val $0:$0)} END{print val}' Input_file

Вывод будет следующим.

Name:SidID:123;Name:JaiID:234;Name:ArunID:12;

Объяснение: Добавление пояснения квыше код тоже сейчас.

awk '                                    ##Starting awk program here.
NF{                                      ##Checking condition if a LINE is NOT NULL and having some value in it.
  val=(val?$0~/^ID/?val $0";":val $0:$0) ##Creating a variable val here whose value is concatenating its own value along with check if a line starts with string ID then add a semi colon at last else no need to add it then.
}
END{                                     ##Starting END section of awk here.
  print val                              ##Printing value of variable val here.
}
'  Input_file                            ##Mentioning Input_file name here.
...