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

时间:2015-12-02 13:48:54

标签: regex awk merge match multiple-columns

我搜索了很多我的问题并测试了不同的解决方案,但似乎都没有。我甚至提前使用了相同的命令,但是现在我无法获得所需的输出。

我有file1

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

和file2

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[$10]=$1; b[$20]=$2; next}($10 in a){ if(match(a[$10],$4)) print $0,a[$10],b[$20]}' file1 file2

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

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

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

编辑:对不起,我没有提及(因为我想保持示例最小),在file2中,某些字段只是" *"。并且我想添加一个"否则不会做匹配"。

2 个答案:

答案 0 :(得分:1)

要求救援!

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

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

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

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

答案 1 :(得分:0)

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

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