我搜索了很多我的问题并测试了不同的解决方案,但似乎都没有。我甚至提前使用了相同的命令,但是现在我无法获得所需的输出。
我有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
它不起作用?
谢谢你的帮忙!
如果可能,你能解释一下答案吗?所以下次我不必寻求帮助!
答案 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
选项,因为您需要完整的字段集;您可以尝试省略它,并且您将在左侧获得一次加入字段,这也可能没问题。