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
我用谷歌搜索了很多我的问题并测试了不同的解决方案,但 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