【问题标题】:File merge on the basis of multiple column match基于多列匹配的文件合并
【发布时间】:2013-12-02 16:56:48
【问题描述】:

配置

service1,208000,rule1
服务2,308000,规则2

文件1

value1,value2,service1|servicex|service2,value3,value4,208000
value1,value2,service1,value3,value4,208000
价值 1,价值 2,服务 1,价值 3,价值 4,
value1,value2,servicex,value3,value4,208000
价值1,价值2,服务2,价值3,价值4,308000
价值1,价值2,服务2,价值3,价值4,308000
value1,value2,service3,value3,value4,408000

输出

value1,value2,service1|servicex|service2,value3,value4,208000,rule1
value1,value2,service1,value3,value4,208000,rule1
value1,value2,service1,value3,value4,,NORULEMATCHING
value1,value2,servicex,value3,value4,208000,NORULEMATCHING
value1,value2,service2,value3,value4,308000,rule2
value1,value2,service2,value3,value4,308000,rule2
value1,value2,service3,value3,value4,408000,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;
  }
}

注意:
- 从配置文件中,我们需要从文件1的第3列(FD后的第一个字段作为管道)和第5列匹配第1列和第2列(组合为主键)
- 如果匹配,则在输出的第 7 列中插入配置文件的第 3 列

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

【问题讨论】:

    标签: awk


    【解决方案1】:

    你可以试试:

    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 很有趣 :)
    猜你喜欢
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多