比较两行,如果匹配则打印列号,否则匹配为NULL

时间:2018-06-21 15:24:56

标签: unix awk

在以下情况下,我需要您的帮助。

文件1:是配置文件 a | b | c | d | e | f | g

文件2:输入文件 a | c | d | g

我必须比较“文件1”和“文件2”并从文件2中打印以下内容

a || c | d ||| g

所以基本上,我需要比较记录和匹配记录,我必须从文件2中打印它,而当不匹配时,我必须放入NULL。

2 个答案:

答案 0 :(得分:0)

我想我可以解释您的要求:您想将File2“重新映射”到File1的标头上。

$ cat File1
first|last|email|phone|address|colour|size

$ cat File2
first|last|phone|size
Glenn|Jackman|555-555-1212|L

$ awk -F '|' '
      NR == FNR {
          n = NF
          for (i=1; i<=NF; i++) head[i] = $i
          print
          next
      }
      FNR == 1 {
          for (i=1; i<=NF; i++) f2head[i] = $i
          next
      }
      {
          for (i=1; i<=NF; i++) data[f2head[i]] = $i
          for (i=1; i<=n; i++) 
              printf "%s%s", data[head[i]], (i<n ? FS : RS)
      }
  ' File1 File2

first|last|email|phone|address|colour|size
Glenn|Jackman||555-555-1212|||L

从第一个块开始,head数组将为:

{1:"first",2:"last",3:"email",4:"phone",5:"address",6:"colour",7:"size"}

从第二个块开始,f2head数组将为:

{1:"first",2:"last",3:"phone",4:"size"}

在第三块中,data数组将为

{"first":"Glenn","last":"Jackman","phone":"555-555-1212","size":"L"}

答案 1 :(得分:0)

另一个awk

$ awk 'BEGIN {FS=OFS="|"}; 
       NR==1 {n=split($0,ht); 
              for(i=1;i<=n;i++) h[ht[i]]=i; next} 
       NR==2 {n2=split($0,h2)}  
             {split($0,t); $0=""; 
              for(i=1;i<=n2;i++) $(h[h2[i]])=t[i]}1' file1 file2

似乎是神秘的,但实际上执行以下操作:

  

在header1(h2)中查找header2(h)值的索引,并在file2($(h[h2[i]]))中设置相应的字段(t[i])。