在以下情况下,我需要您的帮助。
文件1:是配置文件 a | b | c | d | e | f | g
文件2:输入文件 a | c | d | g
我必须比较“文件1”和“文件2”并从文件2中打印以下内容
a || c | d ||| g
所以基本上,我需要比较记录和匹配记录,我必须从文件2中打印它,而当不匹配时,我必须放入NULL。
答案 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]
)。