Обратная токенизация новой строки в файлах с одним токеном на строку? - Юникс

Как разделить токены в строке с помощью Unix ? показал, что файл может быть токенизирован с помощью sed или xargs.

Есть ли способ сделать обратное?

[in:]

some
sentences
are
like
this.

some
sentences
foo
bar
that

[выход]:

some sentences are like this.
some sentences foo bar that

Единственным разделителем в предложении является \n\n. Я мог бы сделать следующее на python, но есть ли способ unix?

def per_section(it):
  """ Read a file and yield sections using empty line as delimiter """
  section = []
  for line in it:
    if line.strip('\n'):
      section.append(line)
    else:
      yield ''.join(section)
      section = []
  # yield any remaining lines as a section too
  if section:
    yield ''.join(section)

print ["".join(i).replace("\n"," ") for i in per_section(codecs.open('outfile.txt','r','utf8'))]

[вышло:]

[u'some sentences are like this. ', u'some sentences foo bar that ']

person alvas    schedule 14.02.2014    source источник
comment
Всегда 5 слов? Как проверить, когда должна измениться новая строка с точкой .?   -  person fedorqui 'SO stop harming'    schedule 14.02.2014
comment
нет, это не всегда 5 слов, 5 слов это совпадение.   -  person alvas    schedule 14.02.2014


Ответы (3)


с помощью awk проще справиться с такой задачей:

awk -v RS="" '{$1=$1}7' file

если вы хотите сохранить несколько пробелов в каждой строке, вы можете

awk -v RS="" -F'\n' '{$1=$1}7' file

с вашим примером:

kent$  cat f
some
sentences
are
like
this.

some
sentences
foo
bar
that

kent$  awk -v RS=""  '{$1=$1}7' f   
some sentences are like this.
some sentences foo bar that
person Kent    schedule 14.02.2014

Вы можете сделать с командой awk следующим образом:

awk -v RS="\n\n" '{gsub("\n"," ",$0);print $0}' file.txt 

Установите разделитель записей как \n\n, что означает, что строки токенизированы в группу строк, разделенных пустой строкой. Теперь напечатайте этот токен, заменив все \n символом пробела.

person nitish712    schedule 14.02.2014

sed -n --posix 'H;$ {x;s/\n\([^[:cntrl:]]\{1,\}\)/\1 /gp;}' YourFile

Основываясь на разделении пустой строки, каждая строка может также отличаться по длине.

person NeronLeVelu    schedule 14.02.2014