awk |拆分列并使用子字符串映射

时间:2013-11-29 09:16:40

标签: awk

File1(包含数百万条记录的大文件)

  

1,5,404920012,TYPE1,INFO1
  4,2,10000234,TYPE2,INFO2
  2,3,40492001223,TYPE3,INFO3
  3,1,50492001223,type4,info4

File2(只有10行的小文件)

  

40492 =产品1
  10000 =产品2

输出

  

1,5,404920012,TYPE1,产品1,INFO1
  4,2,10000234,TYPE2,产品2,INFO2
  2,3,40492001223,TYPE3,产品1,INFO3
  3,1,50492001223,type4,NOMATCH,info4

注意:
我想比较从file1到文件2的第3列的前5个字符 匹配字段后,product1应位于输出的第5列

我所尝试的内容:
虽然我是awk高级编程的新手,但到目前为止我学到了什么...我可以合并2个文件如下:

  

BEGIN {FS = OFS =“,”}               FNR == NR {         X = $ 1;         $ 1 =“”;         a [x] = $ 0;         下一个       }
      {         if($ 3 in a)打印$ 0“,”a [$ 3];         否则打印$ 0“,,”;       }

但问题是..我不知道如何为第二个文件传递不同的FS(=第二个文件的情况下)以及如何组合substr函数echo 404920012 | awk'{print substr($ 0,1,5)}' 如果条件..

2 个答案:

答案 0 :(得分:2)

这种情况,因为它在输入文件之间有所不同,您希望使用-F-v FS=将aw设置为文件之间的适当值,而不是在awk命令参数中预先设置: / p>

awk '
NR==FNR { map[$1] = $2; next }
{
    key = substr($3,1,5)
    $5 = (key in map ? map[key] : "NOMATCH") OFS $5
    print
}
' FS='=' File2 FS=',' OFS=',' File1

以防万一:这比您选择的答案更简洁,功能上它是等效的,所以请不要更改以选择此答案。

答案 1 :(得分:1)

尝试

awk -f p.awk file2 file1

其中p.awk

BEGIN{
    FS=","
    OFS=","
}

NR==FNR {
    split($1,a,"=")
    keys[a[1]]=a[2]
    next
}
{
    k=substr($3,1,5)
    if (k in keys) 
        p=keys[k]
    else
        p="NOMATCH"
    $4=$4 OFS p
    print
}

带输出:

1,5,404920012,type1,product1,info1
4,2,10000234,type2,product2,info2
2,3,40492001223,type3,product1,info3
3,1,50492001223,type4,NOMATCH,info4