Como posso mesclar as linhas de dois arquivos tendo cabeçalhos comuns?

8

Eu quero mesclar dois arquivos com base nos dados comuns presentes neles como cabeçalho.

A seguir, o exemplo

Arquivo1

>Feature scaffold1
1   100  g
101 200  g
201 300  g
>Feature scaffold2
1   100  g
01  500  g
>Feature scaffold3
10  500  g
>Feature scaffold4
10  300  g

Arquivo 2

>Feature scaffold1
500 500 r
900 1000    r
>Feature scaffold2
200 300 r
>Feature scaffold3
100 200 r
>Feature scaffold4
500 600 r
>Feature scaffold5
1   1000    r

E aqui está o tipo de saída que eu quero:

>Feature scaffold1
1   100 g
101 200 g
201 300 g
500 500 r
900 1000    r
>Feature scaffold2
1   100 g
01  500 g
200 300 r
>Feature scaffold3
10  500 g
100 200 r
>Feature scaffold4
10  300 g
500 600 r
>Feature scaffold5
1   1000    r

Eu tentei alguns awk e sed mas claramente não foram bem sucedidos, como posso fazer isso?

    
por Namrata Patel 04.01.2018 / 09:00

2 respostas

7

Awk solução:

awk '/^>/{ k=$1 FS $2 }
     NR==FNR{ 
         if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0; next
     }
     k in a{ 
         print $0 ORS a[k]; delete a[k]; next 
     }1' file1 file2
  • /^>/{ k=$1 FS $2 } - ao encontrar a linha cabeçalho (por exemplo, >Feature ... ) - componha uma chave k dos campos 1a $1 e 2 $2
  • NR==FNR{ ... } - processando o primeiro arquivo de entrada ( file1 ):
    • if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0 - acumula linhas sem cabeçalho na matriz a usando a chave atual k
    • next - pula para o próximo registro
  • k in a - se a chave atual baseada no registro file2 estiver na matriz a (com base nos registros file1 ):
    • print $0 ORS a[k] - imprime registros relacionados
    • delete a[k] - excluir item (ns) processado (s)

A saída:

>Feature scaffold1
1   100  g
101 200  g
201 300  g
500 500 r
900 1000    r
>Feature scaffold2
1   100  g
01  500  g
200 300 r
>Feature scaffold3
10  500  g
100 200 r
>Feature scaffold4
10  300  g
500 600 r
>Feature scaffold5
1   1000    r
    
por 04.01.2018 / 09:30
4

Outra abordagem e para simplificar.

grep -v '^scaffold' <(awk -v RS='>Feature ' \
    'NF{s[$1]=s[$1]$0} END{for (x in s)print RS""s[x]}' file[12])
    
por 04.01.2018 / 10:46