仅打印文件A中不在B中的单词

时间:2014-02-04 21:44:19

标签: shell unix

我有两个文件,我需要打印第一个文件中不在第二个文件中的单词(不是完整的行)。我已经尝试了wdiff但它打印完整的行并没有用。

档案样本:

وكان مكنيل وقتها رئيس رابطة مؤرخي أمريكا ـ 
كما فهمت - من شاهد الحادثة. ثم يصف كيف قدم 
مكنيل الرجلين الخصمين, فكانت له صرامته, إذ 
حدد عشرين دقيقة فقط لكل منهما أن يقدم رأيه 
وحجته, ثم وقت للرد, ثم يجيبان عن أسئلة قليلة 
من القاعة, والمناقشة في وقت محدد.

3 个答案:

答案 0 :(得分:4)

制作两个包含每个单词的文件,并对它们进行排序。然后使用comm

$ cat fileA

ﻮﻛﺎﻧ ﻢﻜﻨﻴﻟ ﻮﻘﺘﻫﺍ ﺮﺌﻴﺳ ﺭﺎﺒﻃﺓ ﻡﺅﺮﺨﻳ ﺄﻣﺮﻴﻛﺍ ـ
ﻚﻣﺍ ﻒﻬﻤﺗ - ﻢﻧ ﺵﺎﻫﺩ ﺎﻠﺣﺍﺪﺛﺓ. ﺚﻣ ﻲﺼﻓ ﻚﻴﻓ ﻕﺪﻣ

$ cat fileB

ﻮﻘﺘﻫﺍ ﺮﺌﻴﺳ ﺭﺎﺒﻃﺓ ﺄﻣﺮﻴﻛﺍ ـ
ﻚﻣﺍ ﻒﻬﻤﺗ - ﻢﻧ ﺵﺎﻫﺩ ﻲﺼﻓ ﻚﻴﻓ ﻕﺪﻣ

$ tr ' ' '\n' < fileA | sort > fileA-sorted
$ tr ' ' '\n' < fileB | sort > fileB-sorted
$ comm -23 fileA-sorted fileB-sorted

ﺎﻠﺣﺍﺪﺛﺓ.
ﺚﻣ
ﻢﻜﻨﻴﻟ
ﻡﺅﺮﺨﻳ
ﻮﻛﺎﻧ

$

这也可以用bash写在一行:

comm -23 <(tr ' ' '\n' < fileA | sort) <(tr ' ' '\n' < fileB | sort)

答案 1 :(得分:1)

这不是一个答案,但评论太久不能发表评论。对不起 - 在这种情况下我还不知道礼仪,所以如果有更好的方法,请告诉我。

我认为其他答案中给出的方法都很有趣,但担心grep版本需要进行m * n比较,其中mn是数字每个文件中的单词分别。

我在OSX上运行bash并运行以下冒烟测试进行比较:

从我的词典中随机选择10K个单词:

gsort -R /usr/share/dict/words | head -n 10000 > words1
gsort -R /usr/share/dict/words | head -n 10000 > words2

比较每个解决方案的运行时间:

使用comm

time comm -23 <(tr ' ' '\n' < words1 | sort) <(tr ' ' '\n' < words2 | sort)

结果:

real    0m0.143s
user    0m0.225s
sys     0m0.018s

使用grep

time grep -wf <(tr ' ' '\n' < words1) <(tr ' ' '\n' < words2)

结果:

real    1m25.988s
user    1m25.925s
sys     0m0.063s

我不确定内存复杂性。我对这种分析的任何批评感兴趣,或者对如何评估哪种解决方案更好的评论感兴趣?

答案 2 :(得分:0)

您可以使用grep

来避免排序(特别是在输入文件很大的情况下)
grep -wf <(tr ' ' '\n' < file1) <(tr ' ' '\n' < file2)