2

希望有人可以提供帮助。

我有两个文件。 file-a好像

    bank
    sofa
    table

file-b是一个“脚本”。例如,它看起来像:

    abcdfg bank
    kitchen abcdfg
    uhuh sofa :=

我只需要知道file-a不匹配任何单词的单词file-b并将其打印到file-c

我知道必须在一个文件中执行此操作,但不知道如何将其与另一个文件进行比较。

我感谢您的帮助。

4

5 回答 5

1

分两步:

fgrep -f file-a -o file-b > this_words_from_file-a_are_in_file-b
sort file-a this_words_from_file-a_are_in_file-b | uniq -u 

(第一次搜索单词,然后只输出找到的单词,然后sort过滤uniq掉那些。)

于 2012-06-05T13:13:39.907 回答
1
fgrep -of file-a file-b | fgrep -vf - file-a

首先查找 file-a 中位于 file-b 中的所有单词,然后再次使用 fgrep 从 file-a 中获取不在该列表中的单词。

于 2012-06-05T14:19:04.667 回答
1

这不会赢得代码高尔夫,但它只对数据进行一次传递,并且不会浪费任何 cpu 时间排序:

awk '{ for( i=1; i<=NF; i++ ) if( NR==FNR ) w[$i]=1; else delete w[$i] }
     END{ for( i in w ) print i}' file-a file-b > file-c

请注意,加速是巨大的。使用file-afile-bas /usr/share/dict/words,这个 awk 解决方案在我的系统上运行了 1.578 秒。John Lawrence 的 fgrep 解决方案的时间:9.157s。Zsolt 的 fgrep 的时间 | 唯一性:4.951。

于 2012-06-05T15:47:54.300 回答
0
join -1 1 -2 2 -v 1 <(sort file-a) <(sort -k2,2 file-b) > file-c
于 2012-06-05T13:14:20.247 回答
0
> fileC; cat fileA | while read ZWORD ; do fgrep -q "$ZWORD" fileB || echo $ZWORD >>fileC; done
$ cat fileC
table

线索

  • > fileC创建一个空文件
  • read读取一行fileA并将其放入变量中ZWORD
  • fgrep不评估$ZWORD为正则表达式
  • -q是安静的
  • ||在前面的命令失败时执行
于 2012-06-05T13:21:36.693 回答