sed / awk - поместить весь текст в одну строку с предыдущим числом

bash awk sed

624 просмотра

5 ответа

Как я могу получить весь текст с номером «число: число» на той же строке, что и предыдущий «номер: число»?

10:15
text line one 
text line two
text no pattern

11:12
random text
text is random 
totally random
could be four lines 
could be five

Должен тогда стать

10:15 text line one text line two text no pattern
11:12 random text text is random totally random could be four lines could be five
Автор: Alfred E. Noobman Источник Размещён: 08.11.2019 11:09

Ответы (5)


2 плюса

Это работает для вашего примера

tr '\n' ' ' < file.txt | sed 's/[0-9]*:[0-9]*/\n&/g'

Explanation-

tr изначально поместит все в одну строку.

Затем этот вкладыш будет вставлять новые строки перед каждым шаблоном num: num.

Автор: Chem-man17 Размещён: 20.08.2016 10:41

2 плюса

Учитывая, что для этого входного файла все, что вам нужно, это сказать awk, чтобы он читал абзац, разделенный пустой строкой, RS=<null>и перекомпилировал каждую запись, используя OFSзначение по умолчанию для пустого символа

$ awk -v RS= '{$1=$1}1' file
10:15 text line one text line two text no pattern
11:12 random text text is random totally random could be four lines could be five
Автор: Ed Morton Размещён: 20.08.2016 05:18

1 плюс

Решения sed и awk объединяют строки до тех пор, пока не будет обнаружена новая запись или не будет введен ввод; в этом случае объединенные строки будут распечатаны и очищены - используйте любое решение

sed oneliner

sed -nr '/^[0-9]{2}:[0-9]{2}$/!{H;$!b}; x; s/\n/ /gp'

сценарий awk

awk '
!/^[0-9]{2}:[0-9]{2}$/ {
  lines=lines" "$0
  next
}
{if(lines) print lines; lines=$0}
END {print lines}
'
Автор: pakistanprogrammerclub Размещён: 20.08.2016 04:03

0 плюса

Вот скрипт GNU AWK:

script.awk

BEGIN { RS = "\n[0-9]+:[0-9]+|\n$" }
      { gsub(/\n/,"",$0)
        printf( "%s%s ", $0,RT) }

Используйте это так awk -f script.awk file.txt

Он использует специальные расширения GNU AWK RTи регулярное выражение RS:

  • разделитель записей установлен на «разделенные двоеточиями пары чисел».
  • чтобы получить последний символ новой строки в конце файла, добавляется "| \ n $", чтобы соответствовать последнему символу новой строки в файле.
  • Чтобы начать разделение на второй паре: «\ n» добавляется впереди. Таким образом, первая разделенная двоеточиями пара чисел "10:15" включена в первую, $0а не в RT.
Автор: Lars Fischer Размещён: 20.08.2016 12:49

0 плюса

Хитрость в том, что вы хотите разбить файл на абзацы, а не на строки. В awk, если вы установите RS = "", он активирует режим абзаца. Каждая итерация цикла awk будет иметь абзац в $ 0. Затем вы можете заменить символы новой строки и превратить их в пробелы.

awk  <data.txt 'BEGIN { RS = "" ; FS = "\n" } { gsub(/\n/, " ", $0) ; print }'

Выход:

10:15 text line one  text line two text no pattern
11:12 random text text is random  totally random could be four lines  could be five

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

Автор: TomOnTime Размещён: 20.08.2016 03:10
Вопросы из категории :
32x32