awk :
awk 'FILENAME == ARGV[1] && NR>1{ df2[$2,$3,$4] }
FILENAME == ARGV[2] && FNR>1{ df3[$2,$3,$4] }
FILENAME == ARGV[3]{ if(FNR == 1) { printf("%s\t%s\t%s\n",$0,$NF,$NF) }
else { printf("%s\t%s\t%s\n",$0, (($2,$3,$4) in df2)? $NF :"NA",(($2,$3,$4) in df3)? $NF :"NA")}
}' df2 df3 df1 | column -t
A saída:
chr start end Id Id Id
chr1 1 400 SN_1 NA NA
chr1 401 800 SN_2 SN_2 NA
chr1 801 1200 SN_3 SN_3 NA
chr1 1201 1600 SN_4 SN_4 SN_4
chr1 1601 2000 SN_5 NA SN_5
chr1 2001 2400 SN_6 NA SN_6
chr1 2401 2800 SN_7 NA NA
-
df2,df3edf1são seus arquivos de segundo, terceiro e primeiro dataframe -
FILENAME- variável interna apontando para o nome do arquivo atualmente processado -
ARGV- variável interna apontando para todos os argumentos passados para o script awk. Por exemplo,ARGV[1]contémdf2 -
FILENAME == ARGV[1] && NR>1- encontrando o primeiro arquivo (ou seja,df2) a partir da segunda linha-
df2[$2,$3,$4]- capturando valores cruciais de " Dataframe 2 " como chave da matrizdf2
-
-
FILENAME == ARGV[2] && FNR>1- encontrando o segundo arquivo (por exemplo,df3) a partir da segunda linha-
df3[$2,$3,$4]- capturando valores cruciais de " Dataframe 3 " como chave da matrizdf3
-
-
FILENAME == ARGV[3]- encontrando o terceiro arquivo (ou seja,df1), o principal Dataframe