Eu tenho dois arquivos separados por tabulação, com a seguinte aparência:
file1:
NC_008146.1 WP_011558474.1 1155234 1156286 44173
NC_008146.1 WP_011558475.1 1156298 1156807 12
NC_008146.1 WP_011558476.1 1156804 1157820 -3
NC_008705.1 WP_011558474.1 1159543 1160595 42748
NC_008705.1 WP_011558475.1 1160607 1161116 12
NC_008705.1 WP_011558476.1 1161113 1162129 -3
NC_009077.1 WP_011559727.1 2481079 2481633 8
NC_009077.1 WP_011854835.1 1163068 1164120 42559
NC_009077.1 WP_011854836.1 1164127 1164636 7
arquivo2:
NC_008146.1 GCF_000014165.1_ASM1416v1_protein.faa
NC_008705.1 GCF_000015405.1_ASM1540v1_protein.faa
NC_009077.1 GCF_000016005.1_ASM1600v1_protein.faa
Quero corresponder a coluna 1 do arquivo1 ao arquivo2 e substituir-se pela respectiva entrada da coluna 2 do arquivo 2. A saída ficaria assim:
GCF_000014165.1_ASM1416v1_protein.faa WP_011558474.1 1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa WP_011558475.1 1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa WP_011558476.1 1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa WP_011558474.1 1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa WP_011558475.1 1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa WP_011558476.1 1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa WP_011559727.1 2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa WP_011854835.1 1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa WP_011854836.1 1164127 1164636 7
Respostas:
Você pode fazer isso muito facilmente com
awk
:Ou, já que isso se parece com um arquivo separado por tabulação:
Isto assume que cada RefSeq (
NC_*
) id nofile1
tem uma entrada correspondente nafile2
.Explicação
NR==FNR
: NR é o número da linha atual, FNR é o número da linha do arquivo atual. Os dois serão idênticos apenas enquanto o 1º arquivo (aquifile2
) estiver sendo lido.a[$1]=$2; next
: se este for o primeiro arquivo (veja acima), salve o segundo campo em uma matriz cuja chave é o primeiro campo. Em seguida, vá para anext
linha. Isso garante que o próximo bloco não seja executado para o 1º arquivo.{$1=a[$1]; print}
: agora, no segundo arquivo, defina o 1º campo como qualquer valor que foi salvo na matriza
para o 1º campo (portanto, o valor associado defile2
) e imprima a linha resultante.fonte
NR == FNR
não funciona corretamente quando o primeiro arquivo está vazio. Veja este e a resposta associada para uma solução alternativafile2
e nãofile1
está vazio. O comportamento saudável quandofile2
está vazio é informar o conteúdo defile1
. O problema comNR == FNR
é que o código associado com ele executa no conteúdo defile1
quandofile2
está vaziaNão há necessidade de awk, supondo que os arquivos sejam classificados, você pode usar a junção de coreutils:
Resultado:
Se seus arquivos não estiverem classificados, você poderá classificá-los primeiro (
sort file1 > file1.sorted; sort file2 > file2.sorted
) e, em seguida, usar o comando acima, ou, se seu shell suportar a<()
construção (o bash suporta), você poderá:fonte
Testado com o comando abaixo e funcionou bem
resultado
fonte