Intereting Posts
Получение символических ссылок, чтобы вести себя как ярлыки в Windows Встроенный сканер Brother DCP-110c не работает в Mint (18,1 x 64) Показать только часть строки, найденной grep (но не той частью, которая соответствует шаблону) Не удается установить VLC на сервер без заголовка Debian, конфликт зависимости с VLC: i386 процесс работает без амперсанда, но не работает с амперсандом Как исправить ошибки ld-linux-x86-64.so.2 CRC? Кукла показывает другую версию версии пакета марионеточного агента postfix переписывать адресатов из определенной группы серверов Postfix не выпускает электронную почту Linux / Embedded Linux – понимание ядра и дополнительных компонентов BSP После того, как я ping ip, сетевые адаптеры потеряют свой ip Как определить версию SLES? «Нет такого файла или каталога» после выполнения ссылки Как выполнить двойную загрузку Win7 и Chrome OS на нетбуке Запуск gui из события acpi

сделать строку в столбец n вставить новую строку в каждую последнюю строку

у меня есть file.txt

john, 5901, open lina, 2401, open jody, 5401, open 

Я хочу вставить новую строку в каждую последнюю строку, результат должен быть:

 john,5901,open lina,2401,open jody,5401,open 

что я пытаюсь

 cat file.txt | tr -d '\n' 

но результат как этот

 john,5901,openlina,2401,openjody,5401,open 

Использование Awk в режиме абзаца :

 $ awk -vRS= -vOFS= '{$1=$1} 1' file.txt john,5901,open lina,2401,open jody,5401,open 

Отключение разделителя записей с помощью RS= приводит к тому, что awk обрабатывает все, что находится между пустыми строками, как одну запись, и добавляет новую строку в список разделителей пробельных полей по умолчанию. Поскольку ваш ввод не содержит других пробелов, это означает, что каждая строка блока становится полем. Затем мы принудительно переоцениваем запись, переназначая значение поля на себя $1=$1 и, наконец, печатаем запись с пустым разделителем выходного поля OFS= вместо единственного пробела по умолчанию.

 $ paste -d '\0' - - - -  

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

В данных уже есть запятые, поэтому мы используем пустой разделитель со paste-d '\0' ).


Решение с использованием sed которое не предполагает, что данные разделены на группы из трех строк:

 $ sed -n 'H; /^$/{x;s/\n//g;p;d;}; ${x;s/\n//g;p;}' file john,5901,open lina,2401,open jody,5401,open 

Это делается путем добавления строк в пространство удержания с помощью H а когда он попадает в пустую строку или конец файла, он удаляет внедренные символы новой строки в пространстве удержания, которые добавил H , и печатает результат.

С awk

 awk '{ printf (NF)?$0:RS } END{ print ""}' infile 

Это объединяет все строки в одну, если это не пустая строка (строка, содержащая / set Tab, Space и Newline).

Это решение не зависит от фиксированных 3 строк в каждой группе.

для конкретного случая, если у вас было несколько пустых строк и чтобы избежать повторения этих строк в результате, вы можете сделать:

 awk 'NF{ skip=0; printf $0; next} !skip{ printf RS; skip=1 } END{ print ""}' infile 

Одним из способов использования POSIXly sed может быть:

 sed -e ' /./!d $ba N /\n$/!{H;s/.*//;x;D;} :a;s/\n//g ' input.txt 

Входные данные :

 % cat -ne input.txt 1 $ 2 $ 3 john,$ 4 5901,$ 5 open$ 6 $ 7 $ 8 $ 9 lina,$ 10 2401,$ 11 open$ 12 $ 13 jody,$ 14 5401,$ 15 open$ 

Выход:

 john,5901,open lina,2401,open jody,5401,open 

Объяснение:

  • Всякий раз, когда sed видит непустую строку (это может сделать любой символ, даже пустой), он начинает добавлять это в пространство шаблона и читает следующую строку.
  • Теперь, если самая правая часть пространства шаблона, то есть текущая строка, считанная в пространство шаблона, является пустой строкой или последней строкой, тогда мы переходим к метке :a где мы быстро удаляем новые строки из пространства шаблона и печатаем в stdout.
  • И в случае, если строка только что прочитанного не является абсолютно пустой, после добавления к пространству шаблона, /\n$/ , мы возвращаемся и добавляем следующую строку. Это мы делаем с помощью команды D которая передает управление в верхнюю часть кода sed . Но перед этим он очищает все до первой новой строки в пространстве шаблонов. этим мы управляем, помещая \n H;s/.*//;x артефакта H;s/.*//;x .