
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 == NR
und FNR == 1
Blöcken gegenüber dem, was Sie in der Frage haben.