Объединить два файла на основе двух общих столбцов и заменить пробел на 0

#unix #awk

#unix #awk

Вопрос:

Мне действительно нужна ваша помощь, чтобы объединить два файла (с 3 столбцами) на основе $ 1 $ 2 и получить все значения в $ 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
  

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее, написанное и протестированное с показанными примерами только в 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