Слияние линий с помощью sed - PullRequest
0 голосов
/ 13 октября 2019

У меня есть текстовый файл, который состоит из 45999 строк. В каждой строке есть слово (униграмма). Я хочу создать два последовательных слова (биграммы). Например:

apple
pie
red
vine

Я хочу 'apple pie', 'pie red', 'red vine'. Я пробовал с sed 'N;s/\n/ /', но он создает только «яблочный пирог» и «красное вино». Как я могу решить эту проблему? Спасибо ..

Ответы [ 2 ]

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

Это может сработать для вас (GNU sed):

sed -nE 'N;s/\n(.*)/ \1&/;P;D' file

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

NB Это не печатает последнюю строку, поскольку она не является парой, если требуется последняя строка, используйте:

sed -E 'N;s/\n(.*)/ \1&/;P;D' file

Если выходдолжен быть напечатан в виде одной строки с каждой парой, заключенной в одинарные кавычки и разделенной запятой, используйте:

sed -E ':a;$!N;s/(\S+)\n(.*)/'\''\1 \2'\'', \2/;ta;s/ (\S+)$/ '\''\1'\''/' file

Или:

sed -E ':a;$!N;s/(\S+)\n(.*)/'\''\1 \2'\'', \2/;ta;s/, \S+$/' file
0 голосов
/ 13 октября 2019

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

awk -v RS="" '
BEGIN{
  OFS=","
  s1="\047"
}
{
  for(i=2;i<=NF;i++){
    print s1 $(i-1) s1, s1 $i s1
  }
}'  Input_file

Вывод будет следующим.

'apple','pie'
'pie','red'
'red','vine'


2-е решение: , поскольку вывод OP неясен, поэтому добавьте и этот.

awk -v RS="" '
BEGIN{
  OFS=","
  s1="\047"
}
{
  for(i=2;i<=NF;i++){
    val=(val?val OFS:"")s1 $(i-1) s1 OFS s1 $i s1
  }
}
END{
  print val
}'  Input_file

Вывод будет следующим.

'apple','pie','pie','red','red','vine'
...