Tengo un archivo delimitado por tabulaciones que se ve así:
gene v1 v2 v3 v4
g1 NA NA NA NA
g2 NA NA 2 3
g3 NA NA NA NA
g4 1 2 3 2
El número de campos en cada línea es fijo e igual. Quiero eliminar esas filas del archivo anterior donde todos los campos para cada fila desde la columna 2 hasta la última es NA. Entonces la salida debería verse así:
gene v1 v2 v3 v4
g2 NA NA 2 3
g4 1 2 3 2
text-processing
awk
perl
bioinformatics
usuario3138373
fuente
fuente
\s\d
diferencia entre las líneas "buenas" y "malas".is.na
cheque si lo creoRespuestas:
Con
awk
:Recorra los campos que comienzan en el segundo campo e imprima la línea si se encuentra un campo que no contiene
NA
. Luego rompe el bucle.fuente
Usando GNU sed
Breve explicación:
g[0-9]\+\(\s*NA\s*\)\+$
es una coincidencia de expresiones regularesg
seguida de al menos un dígito, luego cualquier número deNA
s con espacios opcionales entre hasta el final de la línea.sed -e '/<regex>/d'
elimina todas las líneas que coinciden<regex>
Una expresión regular más estándar con el mismo significado sería:
fuente
\+
y\s
son expresiones regulares no estándar y coincidirán con una simple+
os
en la mayoría de lassed
versiones. Use en\{1,\}
lugar de\+
y en[[:space:]]
lugar de\s
tener un código portátil.Con
all
del módulo Perl List :: Util:fuente
Con
grep
:Esto hace que grep no muestre las
-v
líneas ( ) donde la línea completa (-x
) coincide:fuente
{4}
en lugar de*
después de que elNA
grupo, y es posible que desee cambiar el primer[[:blank:]]*
a[[:blank:]]+
hacer los separadores de espacio en blanco obligatoria. De todos modos, nunca he entendido por qué todos insisten en sacar laawk
bazuca para resolver estos simples problemas de filtrado que segrep
manejan fácilmente.*
para que esta solución funcione igualmente bien para cualquier número arbitrario deNA
columnas, siempre que sean todas NA.Tu podrías intentar:
fuente