Tenho file1 gosta:
0 AFFX-SNP-000541 NA
0 AFFX-SNP-002255 NA
1 rs12103 0.6401
1 rs12103_1247494 0.696
1 rs12142199 0.7672
E um arquivo2:
0 AFFX-SNP-000541 1
0 AFFX-SNP-002255 1
1 rs12103 0.5596
1 rs12103_1247494 0.5581
1 rs12142199 0.4931
E gostaria de um arquivo3 que:
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
O que significa colocar a quarta coluna do arquivo2 em arquivo1 pelo nome da 2ª coluna.
text-processing
awk
join
bioinformatics
Dadong Zhang
fonte
fonte
Respostas:
Isso deve servir:
Importante : isso pressupõe que seus arquivos sejam classificados (como no seu exemplo) de acordo com o nome do SNP. Se não estiverem, classifique-os primeiro:
Saída:
Explicação (de
info join
):Portanto, o comando acima une os arquivos no segundo campo e imprime o primeiro, o segundo e o terceiro campos do arquivo um, seguidos pelo terceiro campo do arquivo2.
fonte
Você poderia usar
awk
:saída:
Explicação:
Percorrer
file2
(NR==FNR
é verdade apenas para o primeiro argumento de arquivo). Guardar coluna 3 na mistura-matriz usando coluna 2 como chave:h[$2] = $3
. Em seguida, percorrafile1
e produza todas as três colunas$1,$2,$3
, anexando a coluna salva correspondente do hash-arrayh[$2]
.fonte
h[$2] = $3
é uma atribuição de hash. Salve$3
como valor e$2
como chave. Exemplo:h["name"] = "Dadong"
. Agora,print h["name"]
saídasDadong
. Ele faz o que você deseja, corresponde exatamente à segunda coluna dos dois arquivos.Se você não precisar de nenhum pedido, uma solução simples seria
Isso pressupõe que todas as linhas têm três entradas e as colunas 1 e 2 dos dois arquivos são iguais (como nos dados de exemplo)
fonte
paste
paste
consegue descobrir uma maneira de responder isso com coreutils?