如果 grep 不匹配,则打印输入的搜索字符串

时间:2021-02-27 04:00:02

标签: search awk grep

我有文件 1

BOB
JOHN
SALLY

我有文件 2

There was a boy called JOHN and he was playing with FRED while
JILL went off to find a bucket of water from TOM but she
fell down the hill.

我想遍历 file1 的单词并在 file2 中搜索这些。
我想打印在 file2 中找不到的单词。

所以输出是

BOB
SALLY

我想是如果 grep 失败,我想打印 grep 正在搜索的字符串。

我从这里开始:

grep -o -f file1 file2 

当然,这会返回

JOHN

如何获取不匹配的原始搜索字符串 - 改为打印?

3 个答案:

答案 0 :(得分:7)

这是完成此操作的 grep 单线:

grep -vxFf <(tr '[[:blank:]]' '\n' < file2) file1

BOB
SALLY

先使用 tr 将空格/制表符转换为换行符,然后使用 grep -vxFf 获取 file1 中不匹配的单词。

或者像大卫在下面的评论中建议的那样:

grep -vxFf <(printf '%s\n' $(<file2)) file1

答案 1 :(得分:5)

根据您展示的样品,您可以尝试以下操作吗。

awk '
FNR==NR{
  arr[$0]
  next
}
{
  for(i in arr){
    if(index($0,i)){
      delete arr[i]
      next
    }
  }
}
END{
  for(i in arr){
    print i
  }
}
' file1 file2

答案 2 :(得分:3)

如果订单不重要,您可以使用:

awk '
    FNR == NR { a[$1]=0; next } 
    { for (i=1;i<=NF;i++)
        if ($i in a)
            a[$i]++
    }
    END { 
        for (i in a)
            if (!a[i])
                print i 
    }
' file1 file2

示例使用/输出

$ awk '
>     FNR == NR { a[$1]=0; next }
>     { for (i=1;i<=NF;i++)
>         if ($i in a)
>             a[$i]++
>     }
>     END {
>         for (i in a)
>             if (!a[i])
>                 print i
>     }
> ' file1 file2
SALLY
BOB