Я не рекомендовал бы смешать и соответствовать типам оболочки в рамках сценария.
Я сказал бы, что Ваш лучший выбор будет состоять в том, чтобы скопировать известный сценарий и изменить оболочку вызова и затем видеть, какие повреждения, таким образом, Вы знаете, где различия в синтаксисе, это должно быть разработано.
Но, короче говоря, попытка к смешиванию и подгонке в рамках сценария просто походит на плохую идею. (лично)
Существует трудный путь и намного более легкий путь. Трудный путь состоит в том, чтобы использовать синтаксический анализ естественных языков для предоставления вероятности, что данная строка находится на английском языке, и отбросьте такие строки.
Более легкий путь состоит в том, чтобы взять список английских стоп-слов и удалить строки, которые содержат элементы из того списка. Если бы Вы хотели уменьшить шанс неправильной категоризации строки, то Вы могли бы также искать присутствие немецких стоп-слов в строках, которые Вам не удается отклонить, чтобы проверить, что они, вероятно, немцы.
Вот очень быстрый и грязный сценарий для использования связанного списка стоп-слова, чтобы сделать фильтрацию:
#!/usr/bin/python
english_stop = set()
with open('english-stop-words.txt') as estop:
for line in estop:
bar = line.find('|')
if bar > -1:
line = line[0:bar]
line = line.strip()
if line:
english_stop.add(line)
with open('mixed-german.txt') as mixg:
for line in mixg:
for word in line.lower().split():
if word in english_stop:
break
else:
print line[:-1]
и вывод:
714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,
715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns,
um den Lauf der Dinge zu ändern.
717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung,
die Zuchtlaboratorien und die modernen Kuhställe besichtigt,
Немного больше полной версии должно проигнорировать различную пунктуацию как ,.
но не английский апостроф '
когда в слове. Еще большая точность могла быть получена путем поиска кодовых точек, которые никогда не происходят на английском языке (например, «ßü
) но это оставляют как осуществление для читателя.
На Вашем образце это работало бы:
awk -v RS= -F '\n' -v OFS='\n' '{NF=NF/2+1;printf "%s", $0 RT}'
RS=
. Устанавливает разделитель записей. Пустое значение является особым случаем, который означает, что запись является абзацем (последовательность строк, разграниченных пустыми строками).-F '\n'
: устанавливает разделителя полей (поля в каждой записи являются строками).OFS='\n'
: устанавливает выходного разделителя полей.Для каждой записи (абзац):
NF=1+NF/2
(или NF=2
(первые 2 строки) + (NF-2)/2
(половина остающихся строк)): измените количество полей для исключения английских.printf "%s", $0 RT
: печатает запись, сопровождаемую рекордным разделителем (для восстановления того же объема интервала между абзацами). Для наблюдения, что делает вышеупомянутый код, полезно, если Вы добавляете некоторые операторы печати в соединение. Что-то вроде этого:Это принимает окончания строки Unix. Если файл находится в формате MS-DOS, как распространено с файлами подзаголовка, необходимо предварительно обработать его с d2u
или dos2unix
.
NF-=NF/2-1
бит. Вы вычисляющий, говорят NF=4
для первой записи, 714. Таким образом, Вы получаете значения NF=4
и NF/2-1=1
, и затем вычитание 1
от NF
отъезд Вас с 3
? Затем печать первого 3
"поля" записи, следовательно отбрасывая 4-ю строку?
– slm♦
31.08.2013, 17:36
Основная часть к этому типу подхода имеет доступ к хорошей базе данных английских слов. Существует этот файл в моей системе, /usr/share/dict/words
который имеет много слов, но другие источники могли использоваться вместо этого.
Мой общий подход должен был бы использовать grep
как так:
$ grep -vwf /usr/share/dict/words sample.txt
Где Ваш вывод в качестве примера находится в sample.txt
.
В моем ограниченном тестировании размера words
словарь, казалось, тонул в трясине grep
вниз. Моя версия имеет 400k + строки в ней. Таким образом, я начал делать что-то вроде этого для разбивания его немного:
$ head -10000 /usr/share/dict/words > ~/10000words
Выполнение Ваш файл посредством использования 1-х 10k слов из "словаря".
$ grep -vwf ~/10000words sample.txt
714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,
715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
I'm giving mine, I'm doing my best
hoping the other will do the same
716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns,
um den Lauf der Dinge zu ändern.
it's going to be hard work
for things to turn around.
717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung,
die Zuchtlaboratorien und die modernen Kuhställe besichtigt,
When visiting artificial insemination centers,
the selection center, modern stables,
Примечание: Этот подход работал через ~1.5 секунды на моем i5 ноутбуке.
Это, кажется, жизнеспособный подход. Когда я ударил его до 100k строк, это начало занимать много времени, хотя, я прервал его, прежде чем это закончилось, таким образом, Вы могли повредиться words
словарь в несколько файлов.
Примечание: Когда я замедлил его к 50k строкам, потребовалось 32 секунды.
Когда я начал разворачивать словарь до 50k, я столкнулся с проблемой, я боялся, перекрытие между языками.
$ grep -vwf ~/50000words sample.txt
714
01:11:22,267 --> 01:11:27,731
715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
hoping the other will do the same
716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns,
um den Lauf der Dinge zu ändern.
717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung,
die Zuchtlaboratorien und die modernen Kuhställe besichtigt,
the selection center, modern stables,
Одна хорошая вещь с этим подходом - Вы, может удалить -v
и посмотрите, где перекрытие:
$ grep -wf ~/50000words sample.txt
Auch wenn noch viele Generationen auf einen Wechsel hoffen,
Even if it takes many generations hoping for a change,
I'm giving mine, I'm doing my best
it's going to be hard work
for things to turn around.
When visiting artificial insemination centers,
Слово auf
находится, по-видимому, на обоих языках... хорошо, по крайней мере, это находится в моем words
файл, таким образом, это могло бы быть определенным подходом метода проб и ошибок для совершенствования списка слов по мере необходимости.
Примечание: Я знал, что это было слово auf
потому что grep
окрашенный этим красный, который не обнаруживается в вышеупомянутом выводе из-за ограниченного характера SE 8-).
$ grep auf ~/50000words
auf
aufait
aufgabe
aufklarung
auftakt
baufrey
Beaufert
beaufet
beaufin
Beauford
Beaufort
beaufort
bechauffeur
grep -wf ...
делает. С лучшим предоставлением слов этот подход был бы более прямым. Другое решение (Stephane's) зависит от структурируемых данных и не смотрит на него никаким контекстным способом, подход msw, кажется, имеют лучшие участки хотя мне.
– slm♦
05.09.2013, 16:55
Это похоже на a .srt
файл. Если это, и если количество английских строк на подзаголовок всегда является тем же как количеством немецких строк, то можно использовать:
awk 'BEGIN { RS="\r\n\r\n"; FS="\r\n"} {for (i=1;i<=(NF-2)/2+2; i++) print $i "\r"; print "\r"}' old.srt > new.srt
Где old.srt
и new.srt
Ваши выбранные входные и выходные файлы.