Awk 基于2个字段合并文件

Awk 基于2个字段合并文件,awk,Awk,文件1 会话=1 | w,事件库=4,操作=1,规则=15 会话=1 | e,事件库=5,操作=2,规则=14 会话=2 | t,事件库=,操作=1,规则=13 文件2 字段1,字段2,字段3,会话=1,字段n,操作=1,字段n 字段1,字段2,字段3,会话=1,字段n,操作=2,字段n 字段1、字段2、字段3、会话=2、字段N、操作=2、字段N 字段1,字段2,字段3,会话=2,字段N,操作=1,字段N 输出 字段1、字段2、字段3、会话=1、字段N、操作=1、字段N、事件库=4、规则=15

文件1

会话=1 | w,事件库=4,操作=1,规则=15
会话=1 | e,事件库=5,操作=2,规则=14
会话=2 | t,事件库=,操作=1,规则=13

文件2

字段1,字段2,字段3,会话=1,字段n,操作=1,字段n
字段1,字段2,字段3,会话=1,字段n,操作=2,字段n
字段1、字段2、字段3、会话=2、字段N、操作=2、字段N
字段1,字段2,字段3,会话=2,字段N,操作=1,字段N

输出

字段1、字段2、字段3、会话=1、字段N、操作=1、字段N、事件库=4、规则=15
字段1、字段2、字段3、会话=1、字段N、操作=2、字段N、事件库=5、规则=14
field1、field2、field3、会话=2、fieldn、操作=2、fieldn、NOMATCH
字段1、字段2、字段3、会话=2、字段N、操作=1、字段N、事件库=、规则=13

我试过了

开始{FS=OFS=“,”}
FNR==NR{
拆分($1,s,“|”)
会话=s[1];
a[session,$3]=session“,“$2”,“$3”,“$4;”
下一步
}
{
拆分($4,x,“|”);
n会话=x[1];
如果(a中的n会话)打印$0 a[n会话,$6];
否则打印$0“,NOMATCH”
}

问题是我无法使用if在2D数组a中找到N会话(a中的N会话)
基于会话和操作的组合匹配2个文件

谢谢。。这很有帮助。。现在我在学习:)谢谢团队

开始{FS=OFS=“,”}
FNR==NR{
拆分($1,s,“|”)
会话=s[1];
a[session,$3]=session“,“$2”,“$3”,“$4;”
下一步
}
{
拆分($4,x,“|”);
n会话=x[1];
key=n会话子集$6
如果(输入a)打印$0一次[n会话,$6];
否则打印$0“,NOMATCH”
}

你可以试试

awk -f merge.awk file1 file2
其中
merge.awk

NR==FNR {
    sub(/[[:blank:]]*$/,"") 
    getSessionInfo(1)
    ar[ses,op]=",eventbase="evb",rule="rule
    next
}

{
    sub(/[[:blank:]]*$/,"") 
    getSessionInfo(0)
    if ((ses,op) in ar)
        print $0 ar[ses,op]
    else
        print $0 ",NOMATCH"

}

function getSessionInfo(f, a) {
    match($0,/session=([^|])[|,]/,a)
    ses=a[1]
    match($0,/operation=([^,]),/,a)
    op=a[1]
    if (f) {
        match($0,/eventbase=([^,]),/,a)
        evb=a[1]
        match($0,/rule=(.*)$/,a)
        rule=a[1]
    }
}