linux - 使用 grep 查找两个大词表之间的差异

标签 linux shell sorting grep comm

我有一个包含英国单词的 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/

相关文章:

linux - 在linux中,如何在搜索完成后清除搜索字符高亮?

Linux:删除不包含所有指定单词的文件

ios - 将列表排序为 TableView 索引的部分

python - 按字母顺序对 Tkinter 选项菜单进行排序?

linux - 在linux中生成字符串的文本文件

linux - X11 转发 : Bad File Number Error?

linux - Linux 的 net 组/域的等效命令?

c++ - 执行 Shell 命令时的性能问题

C++在shell中使用计时器执行多个命令

algorithm - 显示经度/纬度点的子集?