Extraiga columnas de archivos de texto que coincidan con subcadenas de encabezado

Extraiga columnas de archivos de texto que coincidan con subcadenas de encabezado

Me gustaría extraer columnas delimitadas por tabulaciones de un archivo de texto "columns.txt" en el que el encabezado (primera línea) coincide con las subcadenas enumeradas en otro archivo de texto "cadenas".
"columnas.txt" tiene este aspecto:

A   B   C   D   E   F   rs243_A   rs546_G   rs987_T   rs025_C   ...
A   B   C   D   E   F   0         0         0         1         ...
A   B   C   D   E   F   1         1         2         2         ...
A   B   C   D   E   F   0         1         2         0         ...
... ... ... ... ... ... ...       ...       ...       ...       ...

"strings.txt" se ve así:

rs243
rs987  
...

El archivo de texto de salida debe copiar las columnas 1 a 6 de "columns.txt" y luego agregar todas las columnas extraídas (delimitadas por tabulaciones) especificadas en "strings.txt". El archivo de salida "output.txt" debería verse así:

A   B   C   D   E   F   rs243   rs987   ...
A   B   C   D   E   F   0       0       ...
A   B   C   D   E   F   1       2       ...
A   B   C   D   E   F   0       2       ...
... ... ... ... ... ... ...     ...     ...

El código que estoy usando imprime las columnas 1 a 6 en "output.txt" como quiero, pero no agrega las columnas extraídas:

awk -F '\t' -f /data/p_00614/ABCD/scripts/extract.awk /data/strings.txt /data/columns.txt > /data/output.txt

con "extraer.awk":

BEGIN { OFS = FS }

FNR == NR {
    sub("_.*", "", $1)
    columns[$1] = 1
    next
}

FNR == 1 {
    for (i = 1; i <= NF; ++i)
        if (i <= 6 || $i in columns)
            keep[i] = 1
}

{
    nf = split($0, fields, FS)
    $0 = ""
    j = 0

    for (i = 1; i <= nf; ++i)
        if (i in keep)
            $(++j) = fields[i]

    print 
}

Creo que

sub("_.*", "", $1)

No funciona. "_.*"Probablemente no corta todas las subcadenas a partir de _sino solo coincidencias exactas. Alguna sugerencia en como arreglar esto? ¡Gracias!

Respuesta1

Este es un error en el código que proporcioné enuna respuesta anterior a una de tus preguntas(ahora corregido). El _.*bit no debe eliminarse de las cadenas que se leen strings.txt, sino de los datos que se leen columns.txt.

Guión corregido:

BEGIN { OFS = FS }

FNR == NR {
    columns[$1] = 1
    next
}

FNR == 1 {
    for (i = 1; i <= NF; ++i) {
        sub("_.*", "", $i)
        if (i <= 6 || $i in columns)
            keep[i] = 1
    }
}

{
    nf = split($0, fields, FS)
    $0 = ""
    j = 0

    for (i = 1; i <= nf; ++i)
        if (i in keep)
            $(++j) = fields[i]

    print 
}

Tenga en cuenta los cambios muy leves en los bloques FNR == NRy FNR == 1de lo que tiene en la pregunta.

información relacionada