Изучаю азы программирования на 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
Bash +Awk or Sed- объединение двух текстов по предложениям (Хочу соединить два текста последовательно по предложениям)
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 85
- ОС: FreeBSD; Archlinux; Calculate
Re: Bash +Awk or Sed- объединение двух текстов по предложениям
Например
Все предложения должны заканчиваться точкой.
Код: Выделить всё
#!/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
Все предложения должны заканчиваться точкой.
-
- Сообщения: 2
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Bash +Awk or Sed- объединение двух текстов по предложениям
беда в том, что в реальном тексте строки заканчиваются не только вместе с предложениями. потому наряду с резкой, нужно так-же и клеить их. прежде всего нужно переформатировать тексты так, что-бы в одной строке было одно предложение. Считаем, что предложение всегда заканчивается точкой.
Код: Выделить всё
#!/bin/sed -rnf
:begin
s/\./.\n/
t prp
# нет точки, ещё догружаем строчку
N
s/\n/ /
b begin
:prp
# есть точка, печатаем предложение
P
D
примерно так.
а после этого уже можно сливать файлы по строкам (и по предложениям).
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Bash +Awk or Sed- объединение двух текстов по предложениям
дык неправильно:
1) нужно не удалять, а менять символ перевода строки(на пробел). причём перед склейкой нужно срезать лишние пробелы в конце и начале строк.
2) загружать весь текст в одну строку sed - это быдлокод, сродни notepad.exe. Извините. Но это ведёт к жутким тормозам даже на небольших файлах, таких например, как эта страничка.
ЗЫЖ и вообще, bash, sed, tr, awk... такой коктейль будет очень медленно питься... Вам нравится, когда всё тормозит? Лично мне - нет. Особенно в таких простых задачах. Особенно учитывая, что 99% времени скрипт от CycaHuH'а просто кидает данные от одной к другой команде.
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Bash +Awk or Sed- объединение двух текстов по предложениям
ну в awk, какая разница?
PS: конечно запись s/^ +// меня просто убила (s/^\ \{1,\}//) - точно "Сусанин"
