我有一个包含英国单词的 78k 行 .txt 文件和一个包含最常见英国单词的 5k 行 .txt 文件。我想从大列表中整理出最常见的单词,以便我有一个包含不常见单词的新列表。
我设法在另一件事上解决了我的问题,但我真的很想知道,我做错了什么,因为这不起作用。
我尝试了以下方法:
//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
最佳答案
下载您的文件后,我注意到 (a) 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
中。例如,“British”在公共(public)文件中,但不在较大的文件中。普通文件也有“铝”,而较大的文件只有“铝”。
grep 选项是什么意思?对于那些好奇的人:
-f
表示从文件中读取模式。
-F
表示将它们视为固定模式,而不是正则表达式,
-i
表示忽略大小写。
-x
表示整行匹配
-v
表示反转匹配。换句话说,打印那些不匹配任何模式的行。
关于linux - 使用 grep 查找两个大词表之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21840744/