2014-02-17 3 views
2

У меня есть один файл длиной 78k .txt с британскими словами и 5k строк .txt-файл с наиболее распространенными британскими словами. Я хочу разобрать наиболее распространенные слова из большого списка, чтобы у меня появился новый список с не как обычными словами.Использование grep, чтобы найти разницу между двумя большими текстовыми списками

Мне удалось решить мою проблему по другому вопросу, но я бы очень хотел знать, что я делаю неправильно, так как это не работает.

Я попытался следующие:

//To make sure they are trimmed 
cut -d" " -f1 78kfile.txt | tac | tac > 78kfile.txt 
cut -d" " -f1 5kfile.txt | tac | tac > 5kfile.txt 
grep -xivf 5kfile.txt 78kfile.txt > cleansed 
//But this procedure apparently gives me two empty files. 

Если я запускаю только Grep без разреза первых, я получаю слова, которые я знаю, в обоих файлах.

Я также попытался это:

sort 78kfile.txt > 78kfile-sorted.txt 
sort 5kfile.txt > 5kfile-sorted.txt 
comm -3 78kfile-sorted.txt 5kfile-sorted.txt 
//No luck either 

Два текстовых файлов в случае, если кто-то хочет попробовать для них самих: https://www.dropbox.com/s/dw3k8ragnvjcfgc/5k-most-common-sorted.txt https://www.dropbox.com/s/1cvut5z2zp9qnmk/brit-a-z-sorted.txt

+0

См. Принятый ответ для [этого вопроса в StackOverflow] [1]. [1]: http://stackoverflow.com/questions/18204904/fast-way-of-finding-lines-in-one-file-that-are-not-in-another –

+0

'вырезать -d "" -f1 78kfile.txt | tac | tac> 78kfile.txt' почти наверняка предоставит вам неполную копию '75kfile.txt' save для' 5kfile.txt'.Вам нужно сохранить результат конвейеров в отдельный файл, возможно, '78kfile.tmp'. Удачи. – shellter

+0

Вы можете использовать vimdiff, чтобы увидеть разницу между двумя файлами. – Nagaraju

ответ

3

После загрузки файлов, я заметил, что (а) brit-a-z-sorted.txt имеет окончание строк в Microsoft, а 5k-most-common-sorted.txt - окончание строк в Unix и (b) вы пытаетесь выполнить сравнение всей строки (grep -x). Итак, сначала нам нужно преобразовать в общую линию окончание:

dos2unix <brit-a-z-sorted.txt >brit-a-z-sorted-fixed.txt 

Теперь мы можем использовать grep, чтобы удалить общие слова:

grep -xivFf 5k-most-common-sorted.txt brit-a-z-sorted-fixed.txt >less-common.txt 

Я также добавил -F флаг, чтобы гарантировать, что слова будут интерпретироваться как фиксированные строки, а не как регулярные выражения. Это также ускоряет работу.

Отмечу, что в файле 5k-most-common-sorted.txt есть несколько слов, которые не указаны в brit-a-z-sorted.txt. Например, «Британский» находится в общем файле, но не в более крупном файле. Также общий файл имеет «алюминий», а в более крупном файле - только «алюминий».

Что означают опции grep? Для тех, кто завораживает:

-f средство для чтения шаблонов из файла.

-F означает относиться к ним как фиксированные образцы, не регулярные выражения,

-i значит игнорировать регистр.

-x средства сделать всю строка соответствует

-v означает инвертировать матч. Другими словами, напечатайте те строки, которые не соответствуют ни одному из шаблонов.

+0

Большое спасибо. Это очень полезно. Как вы заметили кровоточащие окончания линии MS? – r08o

+0

@ r08o Я заметил, что 'grep -w' (весь шаблон слова) работал, но' grep -x' (целая строка) не сделал. Это заставило меня подозревать, что в одном из файлов должна быть проблема с невидимыми символами. – John1024

Смежные вопросы