
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 == NR
y FNR == 1
de lo que tiene en la pregunta.