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
,df3
edf1
sã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