我对Bash和脚本编写起来很新,可以使用一些帮助。第一个文件中的每个单词由\n
分隔,而第二个文件可以包含任何内容。如果在第二个文件中找不到第一个文件中的字符串,我想输出它。几乎"检查这些单词是否在这些单词中并告诉我那些不是"
File1.txt包含以下内容:
dog
cat
fish
rat
file2.txt包含以下内容:
dog
bear
catfish
魔法 - >大鼠
我知道我想使用grep
(或者我?),命令就是(据我所知):
$foo.sh file1.txt file2.txt
现在为剧本......
我不知道......
grep -iv $1 $2
答案 0 :(得分:1)
使用awk你可以这样做:
awk 'FNR==NR{a[$0]; next} {for (i in a) if (index(i, $0)) next} 1' file2 file1
rat
答案 1 :(得分:1)
使用-f
标记,您可以告诉grep
使用文件。
grep -vf file2.txt file1.txt
要在完整的行上获得匹配,请使用
grep -vFxf file2.txt file1.txt
正如@anubhava评论的那样,这与子串不匹配。要解决此问题,我们将使用grep -Fof file1.txt file2.txt
(所有相关关键字)的结果。
将这些结合起来
grep -vFxf <(grep -Fof file1.txt file2.txt) file1.txt
答案 2 :(得分:1)
试一试。这是直截了当的,没有优化,但它确实(我认为)
while read line ; do
fgrep -q "$line" file2.txt || echo "$line"
done < file1.txt
下面有一个有趣的版本,有4个并行fgrep并使用了额外的result.txt文件。
> result.txt
nb_parrallel=4
while read line ; do
while [ $(jobs | wc -l) -gt "$nb_parralel" ]; do sleep 1; done
fgrep -q "$line" file2.txt || echo "$line" >> result.txt &
done < file1.txt
wait
cat result.txt
您可以增加值4,以便使用更多的并行fgrep,具体取决于cpus和内核的数量以及可用的IOPS。
答案 3 :(得分:0)
您可以执行以下操作:
comm -2 -3 file1.txt file2.txt
还有:
diff -u file1.txt file2.txt
我知道您正在寻找一个脚本,但我认为没有任何理由这样做,如果您仍想要一个脚本,您可以从脚本中运行命令。
答案 4 :(得分:0)
类似awk
$ awk 'NR==FNR{a[$0];next} {for(k in a) if(k~$0) next}1' file2 file1
rat