首页 > 解决方案 > 基于两个公共列合并两个文件,并将空白替换为0

问题描述

我真的需要你的帮助来合并基于 $1$2 的两个文件(有 3 列)并获取 $3 的所有值并将空/空白替换为 0。非常感谢提前

文件1:

chr1 1000001 135       
chr2 1000002 57
chr2 4400002 117    
chr6 1000003 172

文件2:

chr1 1000001 377       
chr1 5500002 320       
chr6 1000003 432

期望的输出:

chr1 1000001 135    377    
chr1 5500002  0    320     
chr2 1000002 57     0
chr2 4400002 117      0
chr6 1000003 172   432

我试过了

awk -F'\t' 'NR==FNR{A[$1$2]=$3; next} {A[$1$2]; B[$1$2]=$3} END{for (id in A) print id,A[id],B[id], "0"}' OFS='\t' File1 File2

输出

chr1 1000001 135       
chr1 1000001 377       
chr1 5500002 320       
chr2 1000002 57
chr2 4400002 117    
chr6 1000003 172
chr6 1000003 432

标签: unixawk

解决方案


您能否尝试仅在 GNU 中使用所示示例进行跟踪、编写和测试awk

awk '
FNR==NR{
  a[$1 OFS $2]=$NF
  next
}
{
  if(($1 OFS $2) in a){
    d[$1 OFS $2]
    $(NF+1)=a[$1 OFS $2]
  }
  else{
    $(NF+1)=0
  }
  print
}
END{
  for(i in a){
    if(!(i in d)){
      print i,"0",a[i]
    }
  }
}
' Input_file2  Input_file1 | sort -k1

输出如下。

chr1 1000001 135 377
chr1 5500002 0 320
chr2 1000002 57 0
chr2 4400002 117 0
chr6 1000003 172 432

推荐阅读