печатать только несколько строк - PullRequest
0 голосов
/ 27 ноября 2018

вход состоит из множества строк строк, разделенных пустыми строками. Мне нужно избавиться от однострочных блоков в печати, оставшихся> 1 строк блоков

исследовать ввод:

block1

block2
block2
block2

block3

block4
block4

block5

block6
block6

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

block2
block2
block2

block4
block4

block6
block6

Ответы [ 5 ]

0 голосов
/ 28 ноября 2018

Использование Perl One-liner

> cat blocks.txt
block1

block2
block2
block2

block3

block4
block4

block5

block6
block6
> perl -ne ' BEGIN { $/="\n\n" } { print if /((.+?)\n)\1{1,}/ } ' blocks.txt
block2
block2
block2

block4
block4

block6
block6
>

Еще один вариант, если файл может поместиться в память

> perl -0777 -ne ' { while(/((.+?)\n)\1{1,}\n?/g) { print "$&" } } ' blocks.txt
block2
block2
block2

block4
block4

block6
block6
>
0 голосов
/ 28 ноября 2018

В sed -

(отредактировано из предложений в комментариях, большое спасибо) -

sed -n '
  /[^[:blank:]]/   H;
  /^[[:blank:]]*$/ { x; /.*[^[:blank:]].*\n.*[^[:blank:]].*/ { p; d; } }
  $                { x; /.*[^[:blank:]].*\n.*[^[:blank:]].*/ { p; n; } }
  ' infile

block2
block2
block2

block4
block4

block6
block6

/[^[:blank:]]/ H; говорит

если есть небланки, добавьте шаблон в область Hold.(Вы можете разработать проверку, чтобы сделать ее более надежной - я собирался привести простой пример.)

/^ *$/ { x; /.*[^ ].*\n.*[^ ].*/ { p; d; } } говорит

/^[[:blank:]]*$/ { в пустых строках,

  • x поменяйте местами шаблон и удерживайте пробелы;затем

  • /.*[^[:blank:]].*\n.*[^[:blank:]].*/ { ЕСЛИ имеются разделенные строкой строки содержимого с пробелами,

  • p; d; печать иудалить (который запускает следующее чтение в пространство шаблона).

  • } } закрыть оба открытых условия.

$ { x; /.*[^[:blank:]].*\n.*[^[:blank:]].*/ { p; n; } } говорит

$ { в строке последняя ,

  • x поменяйте местами образец и удерживайте пробелы;затем

  • /.*[^[:blank:]].*\n.*[^[:blank:]].*/ { ЕСЛИ имеются разделенные строкой строки содержимого с пробелами,

  • p; n; печать ипродолжайте, что завершит программу.

  • } } закрыть оба открытых условия.

Вот и все.

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

0 голосов
/ 27 ноября 2018

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

awk '
NF{
  ++count
  val=val?val ORS $0:$0
}
!NF && count>1{
  print val ORS $0
  val=count=""
}
!NF && count<=1{
  val=count=""
}
END{
  if(val && count){
    print val
  }
}'   Input_file
0 голосов
/ 27 ноября 2018

Это легко сделать с помощью путем переопределения разделителя полей и разделителя записей.

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

Вход, который подается в awk через различные средства (stdin или getline), читается запись по запись , где каждая запись отделена разделителем записей, который определяется RS.Поскольку RS по умолчаниюсимвол \n, запись на самом деле является строкой, и поэтому awk обрабатывает файл по умолчанию для файла по умолчанию.

Когда запись / строка считывается, awk разделяет запись на поля, где каждое поле отделеноразделителем полей FS (который может быть регулярным выражением).По умолчанию разделитель полей FS установлен в любой последовательности символов.Это означает, что по умолчанию каждое поле является словом.Если вы переопределите FS, поля будут другими.

Специальный разделитель записей - пустой RS="", так как он определяет RS и FS

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

источник: awk Стандарт POSIX

Так что вы можете просто сделать следующее:

awk 'BEGIN{RS="";ORS="\n\n"}(NF>1)' file
0 голосов
/ 27 ноября 2018

Вы можете играть с awk разделителем записей :

awk '$2!=""{print $0"\n"}' RS='' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...