在最后一列标题下打印比较结果

时间:2014-12-17 15:38:12

标签: awk ksh gawk

我正在对2个文件file1,file2进行比较,使用file1中的第一列到file2中的第一列,并从第7列中恢复相应的值。

awk -F, 'FNR==NR{a[$1]=$7;next} {print (($1 in a) ? $0","a[$1] : $0",NA");}' file2.txt file1.txt > tmp && mv tmp file1.txt

也会在第二天比较并附加结果。

cat file1.txt 

N1,N2,N3,N4,N5,N6,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10
XX,ZZ,XC,EE,RR,BB,OK,OK,OK,OK,OK,OK,OK,OK
XC,CF,FG,RG,GH,GH,NA,NA,NA,NA,NA,NA,NA,NA,NA
DM,DF,GR,TH,EW,BB

cat file2.txt 

cat file2.txt
DF,GH,MH,FR,FG,GH,NA
XX,ZZ,XC,EE,RR,BB,OK

awk -F, 'FNR==NR{a[$1]=$7;next} {print (($1 in a) ? $0","a[$1] : $0",NA");}' file2.txt file1.txt > tmp && mv tmp file1.txt

mv:覆盖`file1.txt'? ÿ

 cat file1.txt
N1,N2,N3,N4,N5,N6,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,NA ---> Header
XX,ZZ,XC,EE,RR,BB,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK
XC,CF,FG,RG,GH,GH,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA
DM,DF,GR,TH,EW,BB,NA
添加新行后

DM,DF,GR,TH,EW

问题是标题的比较和打印结果也是打印结果  在标题D1下,而不是D10,用于file1中新插入的行

我们如何打印这样的,比较应排除最后一列标题下的标题和结果

N1,N2,N3,N4,N5,N6,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10
XX,ZZ,XC,EE,RR,BB,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK
XC,CF,FG,RG,GH,GH,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA
DM,DF,GR,TH,EW,BB                           ,NA

1 个答案:

答案 0 :(得分:0)

为避免更新标题,请将awk的表达式更改为以下内容:

'FNR==NR{a[$1]=$7;next} FNR==1{print $0; next} {print (($1 in a) ? $0","a[$1] : $0",NA");}'

在这种情况下,file1.txt的第一行将按原样打印,不做任何更改。

但是,您还需要在每次运行时将新的一天(例如" D10和#34;在示例中)添加到标题中吗?或者你在其他地方做到了?

关于第二个问题(在较长行的字符串中的字符串中的相同位置打印新值),您应该进一步修改awk:

'FNR==NR{a[$1]=$7;next} FNR==1{print $0; len=length($0); next} {printf $0; cont=(($1 in a) ? ","a[$1] : ",NA"); for (i=length($0)+1;i<=len-length(cont);i++) printf " " ; print cont;}'