Я пытаюсь объединить две последовательные строки, только если сумма слов двух строк (слов, определенных как последовательные символы, разделенные пробелами или знаком конца строки) меньше 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", "") не избавляется от символа новой строки в конце строки, даже когда я пробую использовать его в одной строке.

Спасибо.

1
HenryM 13 Окт 2019 в 21:57

2 ответа

Лучший ответ

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

Ниже приведен простой способ сделать это; он просто буферизует строки, пока количество слов не достигнет 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
2
oguz ismail 13 Окт 2019 в 20:35

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

awk 'END{printf "\n"}n<=20{ORS=FS}n>20{ORS=RS;n=0}{n+=NF}1' file
-1
Yoda 13 Окт 2019 в 20:03