合并具有两个公共字段的两个文件

合并具有两个公共字段的两个文件

文件1

#CHROM  POS     ID      REF_Zv  ALT_lm                             
chr1A   219620  .       T       A
chr1A   219648  .       A       G
chr1A   219867  .       A       G

文件2

#CHROM  POS     ID      REF_Zv  ALT_RV                             
chr1A   219457  .       C       T
chr1A   219670  .       A       G
chr1A   219867  .       A       C

文件3

#CHROM  POS     ID      REF_Zv  ALT_lm ALT_RV                            
chr1A   219620  .       T       A    NA
chr1A   219648  .       A       G    NA
chr1A   219867  .       A       G    C
chr1A   219457  .       C       NA   T
chr1A   219670  .       A       NA   C 

我的命令是

awk 'FNR==NR{a[$1,$2];next} {if(a[$1,$2]==""){a[$1,$2]=0};print \
$1,$2,$3,$4,$5, a[$4,$5]} ' file1 file2 > file3

但是,我无法获取我想要的 file3。你能帮我改进命令吗?

谢谢,福佑

答案1

我认为您无法一次性完成此操作 - 您要么需要保存索引ALT_lmALT_RV值并将它们合并/打印在一个END块中(在这种情况下,很难保留原始顺序 - 如果这很重要),或者对其中一个文件进行两次传递:例如(丑陋 - 并且需要 GNU Awk):

$ gawk '
  BEGIN {
    OFS="\t";
    print "#CHROM","POS","ID","REF_Zv","ALT_lm","ALT_RV";
  } 
  BEGINFILE { fn++ }
  FNR == 1 {next}
  fn == 1 {ALT_RV[$1 FS $2] = $5; next} 
  fn == 2 {ALT_lm[$1 FS $2] = $5;}
  {   
    print $1, $2, $3, $4, ($1 FS $2) in ALT_lm ? ALT_lm[$1 FS $2] : "NA", ($1 FS $2) in ALT_RV ? ALT_RV[$1 FS $2] : "NA";
  }' file2 file1 file2
#CHROM  POS ID  REF_Zv  ALT_lm  ALT_RV
chr1A   219620  .   T   A   NA
chr1A   219648  .   A   G   NA
chr1A   219867  .   A   G   C
chr1A   219457  .   C   NA  T
chr1A   219670  .   A   NA  G
chr1A   219867  .   A   G   C

相关内容