awk - 如果值匹配则打印文件 1 和文件 2

awk - if values match then print file1 and file 2

我用谷歌搜索了很多我的问题并测试了不同的解决方案,但 none 似乎有效。我什至提前成功使用了相同的命令,但现在我无法获得我想要的输出。

我有文件1

AAA;123456789A
BBB;123456789B
CCC;123456789C

和文件2

1;2;3;CCC;pippo
1;2;3;AAA;pippo
1;2;3;BBB;pippo
1;2;3;*;pippo

我想要的输出是这样的:

1;2;3;CCC;pippo;CCC;123456789C
1;2;3;AAA;pippo;AAA;123456789A
1;2;3;BBB;pippo;BBB;123456789B

我试过这个命令:

awk -F";" -v OFS=";" 'FNR == NR {a[]=; b[]=; next}( in a){ if(match(a[],)) print [=13=],a[],b[]}' file1 file2

但我得到了这个输出(只有一个条目,即使文件更大):

1;2;3;CCC;pippo;CCC;123456789C

我做错了什么?如果它管理一个它应该为所有其他。为什么这没有发生? 还有为什么我设置 a[]= 它不起作用?
谢谢你的帮忙! 如果可能的话,你能解释一下答案吗?这样下次我就不用求助了!

编辑:抱歉,我没有提到(因为我想让示例保持最少)file2 中的某些字段只是“*”。我想添加一个 "else doesn't match do something"。

join 是为这个 sort 的东西制作的:

$ join -t';' -1 4 -o1.{1..5} -o2.{1..2} <(sort -t';' -k4 file2) <(sort -t';' file1)

1;2;3;AAA;pippo;AAA;123456789A
1;2;3;BBB;pippo;BBB;123456789B
1;2;3;CCC;pippo;CCC;123456789C

输出是您要求的,除了行的顺序,我认为这并不重要。 join-o 选项是必需的,因为您需要完整的字段集;你可以尝试省略它,你会在左侧获得一次连接字段,这也可能没问题。

awk 来拯救!

$ awk 'BEGIN{FS=OFS=";"} 
     NR==FNR{a[]=[=10=];next} 
            {print [=10=],a[]}' file1 file2

1;2;3;CCC;pippo;CCC;123456789C
1;2;3;AAA;pippo;AAA;123456789A
1;2;3;BBB;pippo;BBB;123456789B

更新: 基于原始输入文件,它只是在寻找完全匹配。如果要跳过没有匹配项的条目,则需要使用 in a

限定打印块
$ awk 'BEGIN{FS=OFS=";"} 
     NR==FNR{a[]=[=11=];next} 
      in a{print [=11=],a[]}' file1 file2