创建一个脚本,检查文件中的每个单词

时间:2016-03-02 21:33:02

标签: bash shell awk

我对Bash和脚本编写起来很新,可以使用一些帮助。第一个文件中的每个单词由\n分隔,而第二个文件可以包含任何内容。如果在第二个文件中找不到第一个文件中的字符串,我想输出它。几乎"检查这些单词是否在这些单词中并告诉我那些不是"

File1.txt包含以下内容:

dog
cat
fish
rat

file2.txt包含以下内容:

dog
bear
catfish

魔法 - >大鼠

我知道我想使用grep(或者我?),命令就是(据我所知):

$foo.sh file1.txt file2.txt

现在为剧本......

我不知道......

grep -iv $1 $2

5 个答案:

答案 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