вывести строку, содержащую шаблон, объединить следующие строки до следующей строки с найденным шаблоном - PullRequest
1 голос
/ 28 июня 2019

Данные:

<START>|3|This is the first step.
This describes the first step.
There are many first steps to be followed and it can go on for multiple lines as you can see.
<START>|7|This is the eighth step.
This describes what you need to know and practice.
There are many such steps to be followed and it can go on for several lines as you can see.
<START>|14|This is the eleventh step.
This describes how to write a code in awk.
There are many such steps to be followed and it can go on for several lines as you can see.

Пожалуйста, помогите.

Попробовал ниже, но он не печатает строку, содержащую строку.Даже после изменения он по-прежнему не объединяет первую строку со строкой в ​​следующие строки без строки. Новые строки остаются.

awk '/START/{if (NR!=1)print "";next}{printf $0}END{print "";}' file

Требуется вывод:

<START>|3|This is the first step.This describes the first step.There are many first steps to be followed and it can go on for multiple lines as you can see.
<START>|7|This is the eighth step.This describes what you need to know and practice.There are many such steps to be followed and it can go on for several lines as you can see.
<START>|14|This is the eleventh step.This describes how to write a code in awk.There are many such steps to be followed and it can go on for several lines as you can see.

Ответы [ 3 ]

0 голосов
/ 28 июня 2019

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

 sed -n '/START/!{H;$!b};x;s/\n/ /gp' file

Отключить автоматическую печать -n.

Если строка не содержит START, добавьте ее в область удержания и, если это не последняя строка файла, выходят из текущего цикла.

В противном случае перейдите к пробелу и замените все символы новой строки пробелами, и в случае успеха выведите результат.

N.B. Переключаясь в пространство удержания после накопления строк, текущая строка становится первой строкой нового пространства удержания. Кроме того, решение заменяет символы новой строки пробелами, если это нежелательный результат, строки можно просто удалить, используя:

 sed -n '/START/!{H;$!b};x;s/\n//gp' file
0 голосов
/ 28 июня 2019
$ awk '{printf "%s%s", (/^<START>/ ? sep : ""), $0; sep=ORS} END{print ""}' file
<START>|3|This is the first step.This describes the first step.There are many first steps to be followed and it can go on for multiple lines as you can see.
<START>|7|This is the eighth step.This describes what you need to know and practice.There are many such steps to be followed and it can go on for several lines as you can see.
<START>|14|This is the eleventh step.This describes how to write a code in awk.There are many such steps to be followed and it can go on for several lines as you can see.

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

$ awk '/^<START>/{if (NR>1) print rec; rec=""} {rec = rec $0} END{print rec}' file
<START>|3|This is the first step.This describes the first step.There are many first steps to be followed and it can go on for multiple lines as you can see.
<START>|7|This is the eighth step.This describes what you need to know and practice.There are many such steps to be followed and it can go on for several lines as you can see.
<START>|14|This is the eleventh step.This describes how to write a code in awk.There are many such steps to be followed and it can go on for several lines as you can see.

Они оба будут работать с любым awk в любой оболочке на каждом компьютере UNIX.

0 голосов
/ 28 июня 2019

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

awk '
/^<START>/{
  if(value){
     print value
     value=""
  }
  value=$0
  next
}
{
  value=(value?value OFS:"")$0
}
END{
  if(value){
     print value
  }
}'   Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...