Extrahieren Sie Spalten aus einer Textdatei, die mit Header-Teilzeichenfolgen übereinstimmen

Extrahieren Sie Spalten aus einer Textdatei, die mit Header-Teilzeichenfolgen übereinstimmen

Ich möchte tabulatorgetrennte Spalten aus einer Textdatei „columns.txt“ extrahieren, in der die Kopfzeile (erste Zeile) mit Teilzeichenfolgen übereinstimmt, die in einer anderen Textdatei „strings“ aufgelistet sind.
„columns.txt“ sieht folgendermaßen aus:

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" sieht folgendermaßen aus:

rs243
rs987  
...

Die Ausgabetextdatei sollte die Spalten 1-6 aus „columns.txt“ kopieren und dann alle extrahierten Spalten (mit Tabulatoren getrennt) hinzufügen, die in „strings.txt“ angegeben sind. Die Ausgabedatei „output.txt“ sollte wie folgt aussehen:

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       ...
... ... ... ... ... ... ...     ...     ...

Der von mir verwendete Code druckt die Spalten 1 bis 6 wie gewünscht in „output.txt“, fügt die extrahierten Spalten jedoch nicht hinzu:

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

mit "extract.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 
}

ich denke, dass

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

funktioniert nicht. "_.*"schneidet wahrscheinlich nicht jeden Teilstring ab, _sondern nur exakte Übereinstimmungen. Irgendwelche Vorschläge, wie man das beheben kann? Danke!

Antwort1

Dies ist ein Fehler im Code, den ich bereitgestellt habe ineine frühere Antwort auf eine Ihrer Fragen(jetzt korrigiert). Das _.*Bit sollte nicht aus den Zeichenfolgen entfernt werden, die aus gelesen werden strings.txt, sondern aus den Daten, die aus gelesen werden columns.txt.

Korrigiertes Skript:

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 
}

Beachten Sie die sehr geringfügigen Änderungen an den FNR == NRund FNR == 1Blöcken gegenüber dem, was Sie in der Frage haben.

verwandte Informationen