Unix 比较两行,如果匹配则打印列号,如果不匹配则打印空
对于以下情况,我需要您的帮助 文件1:是一个配置文件 a | b | c | d | e | f | g 文件2:输入文件 a | c | d | g 我必须比较“文件1”和“文件2”,并从文件2中打印以下内容 a | | c | d | | gUnix 比较两行,如果匹配则打印列号,如果不匹配则打印空,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
因此,基本上我需要比较两个记录,对于匹配的记录,我必须从文件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}“