¿Cómo puedo fusionar las líneas de dos archivos al tener encabezados comunes?


8

Quiero fusionar dos archivos basados ​​en los datos comunes presentes en ellos como encabezado.

El siguiente es el ejemplo

Archivo1

>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

Archivo 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

Y aquí está el tipo de salida que quiero:

>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

He probado algunos awk y sed pero claramente no he tenido éxito, ¿cómo puedo hacer esto?

Respuestas:


7

Awk solución:

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 }- al encontrar la línea de encabezado (es decir >Feature ...): componga una clave kde los campos primero $1y segundo$2
  • NR==FNR{ ... }- procesamiento del primer archivo de entrada ( file1):
    • if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0- acumule líneas que no sean de encabezado en la matriz ausando la clave actualk
    • next - saltar al siguiente registro
  • k in a- si la clave actual basada en el file2registro está en la matriz a(basada en file1registros):
    • print $0 ORS a[k] - imprimir registros relacionados
    • delete a[k] - eliminar elementos procesados

La salida:

>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

4

Otro enfoque y para hacerlo más simple.

grep -v '^scaffold' <(awk -v RS='>Feature ' \
    'NF{s[$1]=s[$1]$0} END{for (x in s)print RS""s[x]}' file[12])
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.