как объединить две соседние строки, обусловленные суммой слов этих двух строк (рекурсивно) - PullRequest
1 голос
/ 13 октября 2019

Я пытаюсь объединить две последовательные строки, только если сумма слов двух строк (слов, определенных как последовательные символы, разделенные пробелами или знаком конца строки) меньше 20 слов.

ПримерВвод:

1This line has five words.
2This line has unfortunately six words.
3This line has also six words.
4The above three lines have a total of 18 words, which is less than 20, and should be combined into one line.
5This line has only 6 words.

Требуемый вывод:

1This line has five words. 2This line has unfortunately six words. 3This line has also six words.
4The above three lines have a total of 18 words, which is less than 20, and should be combined into one line.
5This line has only 6 words.

У меня есть следующий код в качестве отправной точки, но я не знаю, как сделать условие, чтобы он проверял обе последовательные строки.

awk '{while (sum(NF + NF+1) > 20) {sub ("\n", "")}}1'

Две проблемы это while (sum (NF + NF + 1)> 20) ... как мне сделать так, чтобы он проверял сумму двух последовательных строк? Вторая проблема ... по какой-то причине sub ("\ n", "") не избавляется от символа новой строки в конце строки, даже когда я пробую его в одной строке.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 октября 2019

Awk читает свои входные данные построчно, и невозможно узнать количество полей ( слов в ваших терминах) в следующей строке, не читая их. Итак, ваша логика не сработает.

Ниже приведен простой способ сделать это;он просто буферизует строки, пока количество слов не достигнет 20, освобождает содержимое буфера и так далее.

awk '(c += NF) < 20 {
  buf = (buf sep $0)
  sep = OFS
  next
}
{
  if (NR > 1)
    print buf
  buf = $0
  c = NF
}
END {
  print buf
}' file
0 голосов
/ 13 октября 2019

Вот один из подходов путем изменения ORS - Output Record Separator

awk 'END{printf "\n"}n<=20{ORS=FS}n>20{ORS=RS;n=0}{n+=NF}1' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...