LINUX.ORG.RU

Как объединить несколько строк в одну?

 , ,


0

1

Есть текстовый файл, который содержит строки вида:

С сожалением сообщаю,
что мисс Каллен и ее команда
получили тревожные результаты.
Как объединить строки, чтобы:
С сожалением сообщаю, что мисс Каллен и ее команда получили тревожные результаты.
Т.е., одно предложение, заканчивающееся точкой - одна строка.


Ну убрать переносы строк можно через

tr '\n' ' '

Но тебе, видимо, не нужен перенос после строк, оканчивающиеся точкой?

v9lij ★★★★★
()
Ответ на: комментарий от v9lij

tr убивает же все переносы, получается одна, немного длинноватая строка.

Redf
() автор топика

На bash не знаю, но быть может вариант на python подойдёт.

import sys


def main(src, dest):
    result, current_line = [], ''
    with open(src) as f:
        for line in f:
            line = line.rstrip()
            current_line += line
            if line.endswith('.'):
                result.append(current_line)
                current_line = ''
    with open(dest, 'w') as f:
        f.write('\n'.join(result))


if __name__ == '__main__':
    if len(sys.argv) != 3:
        print('Usage: {} <src> <dest>'.format(sys.argv[0]))
        sys.exit(1)
    main(sys.argv[1], sys.argv[2])

python script.py src.txt dest.txt
Kilte ★★★★★
()
$ cat 1.txt 
С сожалением сообщаю,
что мисс Каллен и ее команда
получили тревожные результаты.

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

С сожалением сообщаю,
что мисс Каллен и ее команда
получили тревожные результаты.
$ perl -l0ne 'print$_?/\./?"$_\n":"$_ ":"\n";' 1.txt 
С сожалением сообщаю, что мисс Каллен и ее команда получили тревожные результаты.

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

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

$
Deleted
()
Ответ на: комментарий от Deleted

У меня короче :P

[18:34] [kalterfx@kfxlaptop ~] $ cat /tmp/1.txt
С сожалением сообщаю,
что мисс Каллен и ее команда
получили тревожные результаты.

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

С сожалением сообщаю,
что мисс Каллен и ее команда
получили тревожные результаты.
[18:34] [kalterfx@kfxlaptop ~] $ cat /tmp/1.txt | perl -pe 's/[^\.]\n//'
С сожалением сообщаючто мисс Каллен и ее командолучили тревожные результаты.

С сожалением сообщаючто мисс Каллен и ее командолучили тревожные результаты.

С сожалением сообщаючто мисс Каллен и ее командолучили тревожные результаты.
kalterfive ★★
()
Ответ на: комментарий от Yur4eg

+1 за xargs
но там придется колдовать над точками.

bl ★★★
()
Ответ на: комментарий от Yur4eg
$ cat file.txt
С сожалением сообщаю,
что мисс Каллен и ее команда
получили тревожные результаты.

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

$ cat file.txt | xargs | sed -e 's/\. /.\n/g'
С сожалением сообщаю, что мисс Каллен и ее команда получили тревожные результаты.
С сожалением сообщаю, что мисс Каллен и ее команда получили тревожные результаты.
nerve ★★
()
Ответ на: комментарий от nerve

Тьфу, опередил! Конечно через sed. Вообще бомба штука! Сколько всего я ей в свое время перелопатил, ух...

Oberstserj ★★
()

Сохранив пустые строки:

cat test|perl -pe 's/([^\A])(?<!\.)\n/$1 /'
С сожалением сообщаю, что мисс Каллен и ее команда получили тревожные результаты.

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

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

liaonau
()

если между фразами есть пустые, то можно POSIX-awk: awk -v RS= '{$1=$1} 1', опционально -v ORS='\n\n'

anonymous
()
[xxx@xxx ~]$ cat test.txt
С сожалением сообщаю,
что мисс Каллен и ее команда
получили тревожные результаты.

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

Бла Бла. Это тоже Тест.И Это
Тест.    Тест.

[xxx@xxx ~]$ awk 'BEGIN {RS="";txt=""} {txt = txt gensub(/\n/, " ", "g")} END {print gensub(/\.[ ]*/, ".\n", "g", txt) }' test.txt
С сожалением сообщаю, что мисс Каллен и ее команда получили тревожные результаты.
С сожалением сообщаю, что мисс Каллен и ее команда получили тревожные результаты.
Бла Бла.
Это тоже Тест.
И Это Тест.
Тест.
PHPFan
()
Ответ на: комментарий от PHPFan

Последовательно:

awk '{txt = txt" "$0; txt = gensub(/^[ ]+/, "", "g", txt)} {while (i = index(txt, ".")) {print substr(txt, 1, i); txt = gensub(/^[ ]+/, "", "g", substr(txt, i+1)) }} END {if (txt) {print txt}}' test.txt
PHPFan
()
Ответ на: комментарий от kalterfive
perl -pe 'tr.\n. .,s.^ .\n.'

Если нужно сохранить отступы между параграфами, добавляй в конце, два \n вместо одного.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

у меня короче (если учитывать двойные переносы) :-P

Кажись, у тебя лучший за тред вариант.

Deleted
()

топик не четай сразу посылай

тебе нужно накапливать ввод то встречи ^[^\.]*\.$ строки - когда копиш толи при помещении в холд толи при выдаче там чуть ли ни есть уже команда стрипующая внутрение переводы строк.

см http://www.grymoire.com/Unix/Sed.html

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.