通过awk合并具有部分匹配的不同文件中的多列

mspsb9vt  于 2022-10-23  发布在  Linux
关注(0)|答案(1)|浏览(307)

我有两个文件,A和B,列之间用\分隔。
文件A2列与文件B1列完全相同。
我想合并这两个文件,保持文件B相同,根据两个文件之间的相同字段添加一个新列,并在文件A的列1和文件B的列2之间进行部分匹配。
我说的部分匹配的意思是这样的:
文件A(第1列)|文件B(第2列)|A=B?
-|-|
A|A?|True
A|ASD|True
B|B|True
C|c|True
C|CA|True
D|A|False

如果文件A中有同一列1和2的,则必须将它们添加到文件B中,以分隔;
文件A

A\2022.10.10\注意a
A\2022.10.10\注b
B\2022.10.14\注c
A\2022.10.14\注d
C\2022.10.15\注e

文件B

2022.10.10\A?
2022.10.14\B?
2022.10.14\a
2022.10.15\C
2022.10.15\D

期望输出

2022.10.10\a?\注a;注b
2022.10.14\B?\注c
2022.10.14\a\注d
2022.10.15\C\注e
2022.10.15\D
我怎么才能用awk做到这一点呢?

mrwjdhj3

mrwjdhj31#

Awk脚本可能会工作,这取决于您的要求的细节(例如,键是否区分大小写)。
这样的awk脚本可能会起作用:

function make_key(k) 
{
    # either return k or an uppercase version for case-insensitive keys
    # return k;
    return toupper(k);
}

BEGIN { 
    FS="\\";
}

NR==FNR {
    key=make_key($2 "\\" $1);
    if( key in notes){
        notes[key]=notes[key] ";" $3
    }
    else {
        notes[key]=$3
    }

}

NR!=FNR {
    for(k in notes){
         pos=index(make_key($0),k);
         if(pos==1){
            printf "%s%s%s%s\n",  $0, FS, notes[k], FS;
            next;
         }
    }
    print $0 FS;
}

您可以这样使用它:

awk -f script.awk file_A file_B

在函数make_key中,您可以通过返回k或大写版本来配置区分大小写。
在读取第一个文件(FILE_A)期间使用NF==FNR块。在这里,笔记存储在由第二列和第一列组成的键下。如果注册表项已经存在,则附加备注。
NF!=FNR块中,读取第二个文件(FILE_B)。在这里,如果FILE_B行以关键字开始,我们通过比较每个关键字来打印FILE_B行和匹配的注解。如果没有匹配的键,则只打印FILE_B行。
BEGIN块只是设置了字段分隔符。

相关问题