Shell awk匹配两个文件中的关键字

Shell awk匹配两个文件中的关键字,shell,awk,Shell,Awk,我使用下面的命令来匹配两个文件中的关键字 awk 'FNR==NR{ids[$0]=$0;next}{for(id in ids){if($0 ~ /\yid\y/){print}}}' file1.txt file2.txt file1.txt的内容 work run file2.txt I am running I will run 期望输出: I will run 但是我没有得到想要的输出。正确的语法是什么 $ awk 'FNR==NR{ids[$0]=$0;next}{for(i

我使用下面的命令来匹配两个文件中的关键字

awk 'FNR==NR{ids[$0]=$0;next}{for(id in ids){if($0 ~ /\yid\y/){print}}}' file1.txt file2.txt
file1.txt的内容

work
run
file2.txt

I am running
I will run
期望输出:

I will run
但是我没有得到想要的输出。正确的语法是什么

$ awk 'FNR==NR{ids[$0]=$0;next}{for(id in ids){if($0 ~ "\\y"id"\\y"){print}}}' file1.txt file2.txt
I will run
  • /\yid\y/
    表示匹配整个单词
    id
    ,而不是
    id
    变量的内容
  • “\\y”id“\\y”
    是三个字符串的串联-
    “\\y”
    id
    变量和
    “\\y”
    • 需要“\\y”
来表示
\y
-请参阅
  • 注意FNR==NR{ids[$0];next}也可以工作,不需要指定值,因为只需要键

  • 使用
    grep的替代解决方案

    $ grep -Ff file1.txt file2.txt
    I am running
    I will run
    $ # -w option ensures to match only whole words
    $ grep -wFf file1.txt file2.txt
    I will run
    

    仅当您需要将以下给定输入的字符串逐字匹配时,才使用
    -F
    选项,awk也将起作用

    awk 'FNR==NR{r=(r?r"|":"")$0;next}FNR==1{r="(^| )("r")( |$)"}$0~r' f1 f2
    
    测试结果:

    $ cat f1
    work
    run
    
    $ cat f2
    I am running
    I will run
    
    $ awk 'FNR==NR{r=(r?r"|":"")$0;next}FNR==1{r="(^| )("r")( |$)"}$0~r' f1 f2
    I will run
    

    请注意
    \y
    是特定于gawk的;它可能在其他awk实现中不起作用+1对于grep方法!请注意,这种方法要求用空格字符分隔单词;它不会找到我运行的
    ,因此我是
    @RuudHelderman您是对的,它不匹配,但OP没有详细提到任何东西,可能是这个
    awk'FNR==NR{r=(r?r“|”):”$0;next}FNR==1{r=“(^[^[:alnum:])(([^[:alnum:].$)”}$0~r'f1
    它会为您给定的字符串提供所需的o/p。