Какой самый быстрый способ удаления строк в файле, которые не совпадают во втором файле? - PullRequest
18 голосов
/ 20 марта 2012

У меня есть два файла, wordlist.txt и text.txt.

Первый файл, wordlist.txt, содержит огромный список слов на китайском, японском и корейском языках, например:

你
你们
我

Второй файл, text.txt, содержит длинные отрывки, например:

你们要去哪里?
卡拉OK好不好?

Я хочу создать новый список слов (wordsfount.txt), но он должен содержать только те строки изwordlist.txt, которые встречаются хотя бы один раз в пределах text.txt.Выходной файл из вышеупомянутого должен показать это:

你
你们

"我" не найден в этом списке, потому что он никогда не найден в text.txt.

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

Я знаю простой способ в BASH, чтобы проверить каждую строку в worlist.txt и посмотреть, если она в text.txt используя grep:

a=1
while read line
do
    c=`grep -c $line text.txt`
    if [ "$c" -ge 1 ]
    then
    echo $line >> wordsfound.txt
    echo "Found" $a
fi
    echo "Not found" $a
    a=`expr $a + 1`
done < wordlist.txt

К сожалению, поскольку wordlist.txt - очень длинный список, этот процесс занимает много часов.Должно быть более быстрое решение.Вот одно из соображений:

Поскольку файлы содержат буквы CJK, их можно рассматривать как гигантский алфавит, содержащий около 8000 букв.Так что почти каждое слово делится символами.Например:

我
我们

Из-за этого факта, если «我» никогда не найден в пределах text.txt, то вполне логично, что «我们» также никогда не появляется.Более быстрый сценарий может сначала проверить «我», и, обнаружив, что его нет, не будет проверять каждое последующее слово, содержащееся в wordlist.txt, которое также содержится в wordlist.txt.Если в wordlist.txt найдено около 8000 уникальных символов, сценарию не нужно проверять столько строк.

Какой самый быстрый способ создать список, содержащий только те слова, которые находятся в первом файлекоторые также находятся где-то во втором?

Ответы [ 12 ]

3 голосов
/ 20 марта 2012

Самый простой способ с bash-скриптом:

  1. Сначала выполняется предварительная обработка с использованием "tr" и "sort", чтобы отформатировать его в одно слово в строке и удалить дублированные строки.

  2. Сделайте это:

cat wordlist.txt | пока читаю я; do grep -E "^ $ i $" text.txt; сделанный;

Вот список слов, которые вы хотите ...

3 голосов
/ 20 марта 2012
new file newlist.txt
for each word in wordlist.txt:
    check if word is in text.txt (I would use grep, if you're willing to use bash)
    if yes:
        append it to newlist.txt (probably echo word >> newlist.txt)
    if no:
        next word
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...