Слияние файлов на основе совпадения нескольких столбцов

конфигурация

служба1,208000,правило1
служба2,308000,правило2

файл1

значение1,значение2,сервис1|servicex|сервис2,значение3,значение4,208000
значение1,значение2,сервис1,значение3,значение4,208000
значение1,значение2,сервис1,значение3,значение4,
значение1,значение2,сервисx ,value3,value4,208000
value1,value2,service2,value3,value4,308000
value1,value2,service2,value3,value4,308000
value1,value2,service3,value3,value4,408000

выход

значение1,значение2,сервис1|servicex|сервис2,значение3,значение4,208000,правило1
значение1,значение2,сервис1,значение3,значение4,208000,правило1
значение1,значение2,сервис1,значение3,значение4,,NORULEMATCHING
> value1,value2,servicex,value3,value4,208000,NORULEMATCHING
value1,value2,service2,value3,value4,308000,rule2
value1,value2,service2,value3,value4,308000,rule2
value1 ,значение2,сервис3,значение3,значение4,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 и столбец 2 (объединенные как первичный ключ) из столбца 3 файла 1 (первое поле после FD в виде канала) и столбца 5.
 – Если он совпадает, вставьте столбец 3 из конфигурационный файл в 7-м столбце вывода

Задача, с которой я сталкиваюсь, - это создание массива на основе двух столбцов.


awk
person Vipin Choudhary    schedule 02.12.2013    source источник


Ответы (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
    }
}
person Håkon Hægland    schedule 02.12.2013
comment
Это потрясающе..теперь я знаю, где я ошибся..ты молодец. - person Vipin Choudhary; 02.12.2013
comment
@VipinChoudhary Спасибо. Ок это весело :) - person Håkon Hægland; 02.12.2013