使用awk将字符串附加到输出文件中的空值

时间:2017-06-26 19:23:19

标签: awk merge null

我正在合并file1:

ID_0001 0001 0 0 1 -9
ID_0002 0002 0 0 1 -9
ID_0003 0003 0 0 1 -9
ID_0004 0004 0 0 1 -9

和file2:

ID_0001 0001 1.25
ID_0002 0002 3.09
ID_0004 0004 2.69

基于每个输入文件的第1列中的公共值,使用以下awk命令:

awk 'NR==FNR {h[$1] = $3; next} {print $1,$2,$3,$4,$5,h[$1]}' file2 file1 > file3

生成的输出文件(file3)如下所示:

 ID_0001 0001 0 0 1 1.25
 ID_0002 0002 0 0 1 3.09
 ID_0003 0003 0 0 1 
 ID_0004 0004 0 0 1 2.69

如何更改脚本以保留" -9" from file1(当没有列1与file2匹配时),或者(或者)用" -9"替换输出文件的第6列中的空值。 (注意:首选保留file1中的第6列值(即选项1):

期望的输出:

 ID_0001 0001 0 0 1 1.25
 ID_0002 0002 0 0 1 3.09
 ID_0003 0003 0 0 1 -9
 ID_0004 0004 0 0 1 2.69

谢谢!

2 个答案:

答案 0 :(得分:1)

可以使用语法condition?true_actions:false_actions中的三元条件运算符来完成,如下所示:

awk 'NR==FNR {h[$1] = $3; next} {print $1,$2,$3,$4,$5,$1 in h?h[$1]:$6}' file2 file1
ID_0001 0001 0 0 1 1.25
ID_0002 0002 0 0 1 3.09
ID_0003 0003 0 0 1 -9
ID_0004 0004 0 0 1 2.69

这是有效的,因为最后一部分$1 in h?h[$1]:$6在伪代码中意味着:

if $1 of current file=file1 belongs in keys of array h, 
  then 
      print h[$1] 
   else 
      print $6 of current file=file1

答案 1 :(得分:1)

$ awk 'NR==FNR{a[$1]=$3;next} $1 in a{$6=a[$1]} 1' file2 file1
ID_0001 0001 0 0 1 1.25
ID_0002 0002 0 0 1 3.09
ID_0003 0003 0 0 1 -9
ID_0004 0004 0 0 1 2.69