Awk 基于多列匹配的文件合并

Awk 基于多列匹配的文件合并,awk,Awk,配置 服务1208000,规则1 服务2308000,规则2 文件1 价值1,价值2,服务1 |服务X |服务2,价值3,价值4208000 值1、值2、服务1、值3、值4208000 值1、值2、服务1、值3、值4, 值1、值2、servicex、值3、值4208000 值1、值2、服务2、值3、值4308000 值1、值2、服务2、值3、值4308000 价值1、价值2、服务3、价值3、价值4408000 输出 价值1,价值2,服务1 |服务X |服务2,价值3,价值4208000,规则1

配置

服务1208000,规则1
服务2308000,规则2

文件1

价值1,价值2,服务1 |服务X |服务2,价值3,价值4208000
值1、值2、服务1、值3、值4208000
值1、值2、服务1、值3、值4,
值1、值2、servicex、值3、值4208000
值1、值2、服务2、值3、值4308000
值1、值2、服务2、值3、值4308000
价值1、价值2、服务3、价值3、价值4408000

输出

价值1,价值2,服务1 |服务X |服务2,价值3,价值4208000,规则1
价值1、价值2、服务1、价值3、价值4208000、规则1
value1、value2、service1、value3、value4、NORULEMATCHING
value1、value2、servicex、value3、Value4208000、NORULEMATCHING
价值1、价值2、服务2、价值3、价值4308000、规则2
价值1、价值2、服务2、价值3、价值4308000、规则2
value1、value2、service3、value3、Value4408000、NORULEMATCHING

我尝试了以下方法:

awk -f myawk.awk config file1
其中
myawk.awk

BEGIN { FS = OFS = "," }
FNR == NR {
  servicename=$1;
  qos=$2;
  $1 = "";
  $2 = "";
  a[servicename,qos] = $0;
  next
}
{
  split($3,plan,"|");
  if(plan[1]","$6 in a){
        split(a[plan[1]","$6],ruledesc,",");
        $7 = ruledesc[3];
        print $0;
  }
  else {
        $7 = NORULEMATCHING;
        print $0;
  }
}
注:
-从配置文件中,我们需要匹配file1的column3(FD之后的第一个字段作为管道)和column5中的column1和column2(合并为主键) -如果匹配,则在输出的第7列中插入配置文件的第3列

我面临的挑战是在2列的基础上创建一个数组。

您可以尝试:

awk -f myawk.awk config file1
其中
myawk.awk
为:

BEGIN { FS = OFS = "," }
FNR == NR {
    a[$1,$2] = $3
    next
}
{
    split($3,plan,"|")
    key=plan[1] SUBSEP $6
    if( key in a){
        $7 = a[key]
        print $0
    } else {
        $7 = "NORULEMATCHING"
        print $0
    }
}

太棒了…现在我知道我错在哪里了。。你太棒了。@VipinChoudhary谢谢。Awk很有趣:)