Unix 比较两行,如果匹配则打印列号,如果不匹配则打印空

Unix 比较两行,如果匹配则打印列号,如果不匹配则打印空,unix,awk,Unix,Awk,对于以下情况,我需要您的帮助 文件1:是一个配置文件 a | b | c | d | e | f | g 文件2:输入文件 a | c | d | g 我必须比较“文件1”和“文件2”,并从文件2中打印以下内容 a | | c | d | | g 因此,基本上我需要比较两个记录,对于匹配的记录,我必须从文件2打印它,当不匹配时,我必须输入空值。我想我可以解释你的问题:你想将文件2“重新映射”到文件1的头上 $ cat File1 first|last|email|phone|address|co

对于以下情况,我需要您的帮助

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

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

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

a | | c | d | | g


因此,基本上我需要比较两个记录,对于匹配的记录,我必须从文件2打印它,当不匹配时,我必须输入空值。

我想我可以解释你的问题:你想将文件2“重新映射”到文件1的头上

$ 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
从第二个块开始,
f2head
数组将是:

{1:"first",2:"last",3:"email",4:"phone",5:"address",6:"colour",7:"size"}
{1:"first",2:"last",3:"phone",4:"size"}
在第三个块中,将显示
数据
数组

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

另一个
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
$awk'开始{FS=OFS=“|”};
NR==1{n=split($0,ht);

对于(i=1;我想知道,请在您的帖子中以代码标记的形式发布更清晰的输入和输出示例。每个文件是否只包含一行/记录,还是有很多?如果有很多是文件1的第1行,而不是文件2的第1行,或者每一行是否需要根据某些条件在另一个文件中查找匹配项?@jnevil-文件1将有只有一条记录。文件2将有许多记录。因此,我必须将文件1与文件2中的第一条记录进行比较,并生成和awk命令,以打印输出Irequire@royal23enfield,请您更清楚地发布输入和输出示例。@RavinderSingh13文件1-它是一个配置文件,只有头文件。文件2-输入文件它包含多行以及标题。要求:比较文件1和文件2的标题,如果有任何列缺少空值,则需要在文件2数据中追加空值。因此,我的想法是使用awk并打印文件2。为此,我需要比较两个文件并生成如下所示:awk'{print$1,NULL,£2}“