Comment puis-je fusionner les lignes de deux fichiers en ayant des en-têtes communs?

8

Je veux fusionner deux fichiers en fonction des données communes présentes en tant qu'en-tête.

Voici l'exemple

File1

>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

Fichier 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

Et voici le type de sortie que je veux:

>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

J'ai essayé un peu d'awk et de sed mais n'ai clairement pas réussi, comment puis-je faire cela?

Namrata Patel
la source

Réponses:

7

Awk Solution:

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 }- en rencontrant la ligne d'en- tête (ie >Feature ...) - composez une clé à kpartir des 1er $1et 2e $2champs
  • NR==FNR{ ... }- traitement du 1er fichier d'entrée ( file1):
    • if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0- accumuler des lignes non en-tête dans un tableau en autilisant la clé actuellek
    • next - passer au prochain record
  • k in a- si la clé actuelle basée sur l' file2enregistrement est dans le tableau a(basée sur les file1enregistrements):
    • print $0 ORS a[k] - imprimer les enregistrements associés
    • delete a[k] - supprimer les articles traités

Le résultat:

>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
RomanPerekhrest
la source
4

Une autre approche et pour le simplifier.

grep -v '^scaffold' <(awk -v RS='>Feature ' \
    'NF{s[$1]=s[$1]$0} END{for (x in s)print RS""s[x]}' file[12])
αғsнιη
la source