У меня есть следующие данные с несколькими строками

username: joe
empid: 1111
status: resigned

username: tom
emid: 1234

username: kate
empid: 2222
status: resigned

Что я хочу, чтобы получить данные в другой файл, как показано ниже

username: joe,empid: 1111,status: resigned
username: tom,empid: 1234
username: kate,empid: 2222,status: resigned

С наилучшими пожеланиями, KJ

4 ответа4

3

Вот более короткая версия Perl:

perl -000 -ne 's/\n+/,/g; s/,$//g; print "$_\n"' filename.txt

-000 активирует режим абзаца, где несколько последовательных символов новой строки определяют входную запись.

0

Используя gawk,

gawk '{s=$1 $2;for(i=3;i<NF;i+=2) {s=s "," $i $(i+1)}print s}' RS= IFS=":"  input.txt

Но обратите внимание, что это "съедает" пробелы после "разделителя полей" (:).

0

Мне удалось сделать это с помощью

perl -p -e 's/\n/,/' filename.txt | perl -p -e 's/,,/\n/g' | perl -p -e 's/,\Z/\n/g'

Первая команда заменяет новые строки запятыми, вторая помещает новую строку туда, где раньше находились две строки, а третья удаляет последний артефакт запятой и заменяет ее новой строкой.

Возможно, все это можно сделать одной командой, но я не достаточно знаком с perl чтобы это делать. Причина, по которой я использую его здесь, заключается в том, что sed не предлагает простого решения для замены строк.

-2

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

tr '\n' ',' filename.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .