合并文件基于2个字段

时间:2013-12-04 16:17:44

标签: awk

文件1

  

会话= 1 | W,eventbase = 4,操作= 1,规则= 15
      会话= 1 | E,eventbase = 5,操作= 2,规则= 14
      session = 2 | t,eventbase =,operation = 1,rule = 13

file2的

  

FIELD1,FIELD2,字段3,会话= 1,字段N,操作= 1,字段N
      FIELD1,FIELD2,字段3,会话= 1,字段N,操作= 2,字段N
      FIELD1,FIELD2,字段3,会话= 2,字段N,操作= 2,字段N
      field1,field2,field3,session = 2,fieldn,operation = 1,fieldn

输出

  

FIELD1,FIELD2,字段3,会话= 1,字段N,操作= 1,字段N,eventbase = 4,规则= 15
      FIELD1,FIELD2,字段3,会话= 1,字段N,操作= 2,字段N,eventbase = 5,规则= 14
      FIELD1,FIELD2,字段3,会话= 2,字段N,操作= 2,字段N,NOMATCH
      field1,field2,field3,session = 2,fieldn,operation = 1,fieldn,eventbase =,rule = 13

我试过了

  

BEGIN {FS = OFS =“,”}
      FNR == NR {
        拆分($ 1,S, “|”)
        会话= S [1];
        a [session,$ 3] = session“,”$ 2“,”$ 3“,”$ 4;
        接下来
      }
      {
        拆分($ 4,X, “|”);
        nsession = X [1];
        if(nsession in a)打印$ 0 a [nsession,$ 6];
        否则打印$ 0“,NOMATCH”;
      }

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

2 个答案:

答案 0 :(得分:0)

谢谢..它帮了..现在我正在学习:)谢谢团队

  

BEGIN {FS = OFS =“,”}
      FNR == NR {
        拆分($ 1,S, “|”)
                会话= S [1];
        a [session,$ 3] = session“,”$ 2“,”$ 3“,”$ 4;
        接下来
      }
      {
            拆分($ 4,X, “|”);
        nsession = X [1];
        key = nsession SUBSEP $ 6
        if(键入a)打印$ 0 a [nsession,$ 6];
        否则打印$ 0“,NOMATCH”;
      }

答案 1 :(得分:0)

你可以尝试

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]
    }
}