【问题标题】:Find same words in two text files在两个文本文件中查找相同的单词
【发布时间】:2013-04-29 01:29:51
【问题描述】:

我有两个文本文件,每个文件包含超过 50 000 行。我需要在两个文本文件中找到相同的单词。我尝试了 COMM 命令,但得到的答案是“文件 2 未按排序顺序”。我试图通过命令 SORT 对文件进行排序,但它不起作用。我在 Windows 中工作。它不必在命令行中解决。它可以在一些程序或其他东西中解决。谢谢你的每一个想法。

【问题讨论】:

  • 详细介绍一下您的文字。每行一个字?还是 CSV?要不然是啥?举几个例子就好了
  • 第一个文本文件包含一个单词,每行带有字符 #、& 或 *。第二个文件包含一个单词,每行有一个数字。

标签: sorting text comm


【解决方案1】:

如果单词不在自己的线上,那么 comm 帮不了你。

如果你有一套方便的 unix 实用程序,比如 Cygwin,(你提到了 comm,所以你可能还有其他的)你可以这样做:

$ tr -cs "[:alpha:]" "\n" < firstFile | sort > firstFileWords
$ tr -cs "[:alpha:]" "\n" < secondFile | sort > secondFileWords
$ comm -12 firstFileWords secondFileWords > commonWords

前两行将每个文件中的单词转换为每行上的一个单词,它还对文件进行排序。

如果您只对单个单词感兴趣,可以将sort 更改为sort -u 以获取唯一集。

【讨论】:

    【解决方案2】:

    如果要对文件进行排序,则必须使用某种外部排序(如合并排序),以便有足够的内存。至于另一种方法,您可以浏览第一个文件并找到所有单词并将它们存储在哈希表中,然后浏览第二个文件并检查重复的单词。如果单词是实际单词而不是胡言乱语,则第二种方法将起作用并且更容易。由于文件太大,您可能不想使用脚本语言,但它可能会起作用。

    【讨论】:

    • 50k 行并不大。如果一条线有正常长度。在内存中处理就可以了。
    • 不管你怎么说肯特,因为他提到了文件中的行数,我认为这对他来说可能是个问题