Bash +Awk or Sed- объединение двух текстов по предложениям (Хочу соединить два текста последовательно по предложениям)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

supaFly
Сообщения: 2

Bash +Awk or Sed- объединение двух текстов по предложениям

Сообщение supaFly »

Изучаю азы программирования на Bash
Поставил следующую практическую задачу

Есть такой метод изучения иностранных языков- чтение на двух языках. Допустим, две книжки рядом, одна на английском, другая на шведском.
Если есть два текста в электронном виде, можно разбить на предложения и вывести на экран рядом. Читай, учись. У нас такой метод обучения продвигает Илья Франк.

Но что мешает сделать подобную программу на bash script?

Мне пока мешает слабое понимание предмета.
Итак, дано

Два текста.
text1.txt
---------------
Sentence 1 in English. Sentence 2 in English. Sentence 3 in English.
--------------
text2.txt
---------------
XSSentence X1 in German. XSSentence X2 in German. XSSentence X3 in German.

final text
---------------
Sentence 1 in English.
XSSentence X1 In German.
Sentence 2 In English.
XSSentence X2 in German.
Sentence 3 In English.
XSSentence X3 In German.
---------------
Наверное лучше всего разбивать на предложения по знакам пунктуации, точке например
Пока из доступного в сети сваял следующее.
Но разбивает не по предложениям, читать не удобно

Что я делаю не так?

#!/bin/bash
file1="english.txt"
file2="german.txt"
newfile="final"
i=1
while [[ "$i" -le "$(wc -l $file1 | awk '{print $1}')" ]]; do
sed -n ${i}p $file1 | sed -e 's/[!?.]/\n\n/g' >> $newfile
sed -n ${i}p $file2 | sed -e 's/[!?.]/\n\n/g' >> $newfile
let i++
done
Спасибо сказали:
Аватара пользователя
CycaHuH
Сообщения: 85
ОС: FreeBSD; Archlinux; Calculate

Re: Bash +Awk or Sed- объединение двух текстов по предложениям

Сообщение CycaHuH »

Например

Код: Выделить всё

#!/bin/bash

file1="text1.txt"
file2="text2.txt"

result_file="final"

i=1
N=`cat $file1 | tr -d "\n" | awk -F. '{print NF}'`
echo $N

while [ $i -lt $N ]; do
    cat $file1 | tr -d "\n" | awk -F. -va=$i '{print $a "."}' | sed 's/^\ \{1,\}//' >> $result_file
    cat $file2 | tr -d "\n" | awk -F. -va=$i '{print $a "."}' | sed 's/^\ \{1,\}//' >> $result_file
    i=`expr $i + 1`
done

Все предложения должны заканчиваться точкой.
Спасибо сказали:
supaFly
Сообщения: 2

Re: Bash +Awk or Sed- объединение двух текстов по предложениям

Сообщение supaFly »

CycaHuH писал(а):
13.01.2009 08:55

Интересно! Хитрая штука текст, много там скрытого форматирования понатыкано....
Как-то себя скромнее ощущаю, когда даже длину строки толком не можешь контролировать....
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Bash +Awk or Sed- объединение двух текстов по предложениям

Сообщение drBatty »

supaFly писал(а):
13.01.2009 07:28
Два текста.
text1.txt
---------------
Sentence 1 in English. Sentence 2 in English. Sentence 3 in English.
--------------
text2.txt
---------------
XSSentence X1 in German. XSSentence X2 in German. XSSentence X3 in German.

беда в том, что в реальном тексте строки заканчиваются не только вместе с предложениями. потому наряду с резкой, нужно так-же и клеить их. прежде всего нужно переформатировать тексты так, что-бы в одной строке было одно предложение. Считаем, что предложение всегда заканчивается точкой.

Код: Выделить всё

#!/bin/sed -rnf
:begin
s/\./.\n/
t prp
# нет точки, ещё догружаем строчку
N
s/\n/ /
b begin
:prp
# есть точка, печатаем предложение
P
D

примерно так.
а после этого уже можно сливать файлы по строкам (и по предложениям).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Bash +Awk or Sed- объединение двух текстов по предложениям

Сообщение /dev/random »

drBatty писал(а):
05.03.2010 21:00
беда в том, что в реальном тексте строки заканчиваются не только вместе с предложениями. потому наряду с резкой, нужно так-же и клеить их.

Так он клеит. tr -d '\n'.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Bash +Awk or Sed- объединение двух текстов по предложениям

Сообщение drBatty »

/dev/random писал(а):
06.03.2010 09:08
Так он клеит. tr -d '\n'.

дык неправильно:
1) нужно не удалять, а менять символ перевода строки(на пробел). причём перед склейкой нужно срезать лишние пробелы в конце и начале строк.
2) загружать весь текст в одну строку sed - это быдлокод, сродни notepad.exe. Извините. Но это ведёт к жутким тормозам даже на небольших файлах, таких например, как эта страничка.

ЗЫЖ и вообще, bash, sed, tr, awk... такой коктейль будет очень медленно питься... Вам нравится, когда всё тормозит? Лично мне - нет. Особенно в таких простых задачах. Особенно учитывая, что 99% времени скрипт от CycaHuH'а просто кидает данные от одной к другой команде.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Bash +Awk or Sed- объединение двух текстов по предложениям

Сообщение /dev/random »

drBatty писал(а):
06.03.2010 09:24
2) загружать весь текст в одну строку sed - это быдлокод, сродни notepad.exe. Извините. Но это ведёт к жутким тормозам даже на небольших файлах, таких например, как эта страничка.

А он и не загружает )))
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Bash +Awk or Sed- объединение двух текстов по предложениям

Сообщение drBatty »

CycaHuH писал(а):
13.01.2009 08:55
cat $file1 | tr -d "\n" | awk -F. -va=$i '{print $a "."}' | sed 's/^\ \{1,\}//' >> $result_file

/dev/random писал(а):
06.03.2010 09:48
А он и не загружает )))

ну в awk, какая разница?
PS: конечно запись s/^ +// меня просто убила (s/^\ \{1,\}//) - точно "Сусанин" :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: