2014-02-17 38 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'的完整副本保存爲'5kfile.txt'。YOu需要將管道的結果保存到一個單獨命名的文件中,也許是'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

相關問題