希望有人可以提供帮助。
我有两个文件。
file-a
好像
bank
sofa
table
file-b
是一个“脚本”。例如,它看起来像:
abcdfg bank
kitchen abcdfg
uhuh sofa :=
我只需要知道file-a
不匹配任何单词的单词file-b
并将其打印到file-c
我知道必须在一个文件中执行此操作,但不知道如何将其与另一个文件进行比较。
我感谢您的帮助。
分两步:
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
掉那些。)
fgrep -of file-a file-b | fgrep -vf - file-a
首先查找 file-a 中位于 file-b 中的所有单词,然后再次使用 fgrep 从 file-a 中获取不在该列表中的单词。
这不会赢得代码高尔夫,但它只对数据进行一次传递,并且不会浪费任何 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-a
和file-b
as /usr/share/dict/words
,这个 awk 解决方案在我的系统上运行了 1.578 秒。John Lawrence 的 fgrep 解决方案的时间:9.157s。Zsolt 的 fgrep 的时间 | 唯一性:4.951。
join -1 1 -2 2 -v 1 <(sort file-a) <(sort -k2,2 file-b) > file-c
> 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
是安静的||
在前面的命令失败时执行