mesclando dois arquivos de acordo com uma coluna comum

2

Eu tenho 2 arquivos. Arquivo1 é:

chr19   4124051 4124250 1
chrX    154458151   154458200   2
chr22   37019451    37019600    3
chr15   74995401    74995550    4
chr12   128823901   128824100   5

e o arquivo 2 é:

chr19   4124051 4124250 1   CUP
chr15   74995401    74995550    4   CUP
chr12   128823901   128824100   5   CUP
chr12   122752651   122752950   8   CUP
chr13   113297001   113297350   9   CUP

e gostaria de ter um File3 assim:

chr19   4124051 4124250 1 CUP
chrX    154458151   154458200   2
chr22   37019451    37019600    3
chr15   74995401    74995550    4 CUP
chr12   128823901   128824100   5 CUP

Gostaria de mesclar os dois arquivos de acordo com a coluna 4 do Arquivo1 e adicionar valores da coluna 5 do Arquivo2 à última coluna do Arquivo1 sempre que houver uma correspondência.

Eu cansei disso:

awk 'FNR==NR{a[$4]=$5;next} {print $1,$2,$3,$4,a[$4]}' File2 File1 > file3

mas não funcionou, cria uma linha extra em cada linha.

Eu também tentei participar do comando:

join -1 4 -2 4 -o'1.1,1.2,1.3,1.4,2.5' File1 File2

e cria um arquivo vazio.

Alguma sugestão?

    
por Chiara 07.06.2017 / 16:50

3 respostas

2

Seus arquivos foram criados no Windows para que eles tenham finais de linha no estilo do Windows ( \r\n ). Remova o \r e tudo funcionará conforme o esperado:

sed -i 's/\r//' File1
sed -i 's/\r//' File2
awk 'FNR==NR{a[$4]=$5;next} {print $1,$2,$3,$4,a[$4]}' File2 File1 > file3
    
por 08.06.2017 / 12:43
1

junte-se + solução classificar :

join -j4 -a1 -o1.1,1.2,1.3,1.4,2.5 <(sort -k4 File1) <(sort -k4 File2) | column -t

A saída:

chr19  4124051    4124250    1  CUP
chrX   154458151  154458200  2
chr22  37019451   37019600   3
chr15  74995401   74995550   4  CUP
chr12  128823901  128824100  5  CUP
  • -j4 - junte-se pela quarta coluna

  • -a1 - imprima linhas não parciais do primeiro arquivo

  • sort -k4 File1 - classifica o arquivo pela quarta coluna / chave ( -k4 )

por 07.06.2017 / 16:57
0
perl -F'\s+' -lane '
   s/\r$//; my $i = join $;, @F[0,3];
   @ARGV and $h{$i} = $F[4],next;
   print exists $h{$i} ? s/$/ $h{$i}/r : $_;
' File2 File1

Dá:

chr19   4124051 4124250 1
chrX    154458151   154458200   2
chr22   37019451    37019600    3
chr15   74995401    74995550    4 CUP
chr12   128823901   128824100   5 CUP
    
por 08.06.2017 / 15:09