
Tengo un archivo como este:
sample chr start end ref alt gene effect
AADA-01 chr1 12336579 12336579 C T VPS13D Silent
AADA-02 chr1 20009838 20009838 - CCA TMCO4 Missense
AADA-03 chr1 76397825 76397825 GTCA T ASB17 Missense
AADA-03 chr1 94548954 94548954 C A ABCA4 Missense
AADA-04 chr1 176762782 176762782 TCG C PAPPA2 Missense
AADA-04 chr1 183942764 183942764 - T COLGAL Missense
AADA-05 chr1 186076063 186076063 A TGC HMCN1 Silent
AADA-05 chr1 186076063 186076063 A T HM1 Silent
Necesito todas las líneas donde las columnas quinta y sexta contienen solo un carácter.
Y el resultado debería verse así:
sample chr start end ref alt gene effect
AADA-01 chr1 12336579 12336579 C T VPS13D Silent
AADA-03 chr1 94548954 94548954 C A ABCA4 Missense
AADA-05 chr1 186076063 186076063 A T HM1 Silent
Intenté usar esto.
awk -F'\t' '$5' filename | awk -F'\t' '$6' filename | wc -l
Sé que esto está mal, pero ¿alguien puede corregir mi error, por favor?
Respuesta1
awk 'NR==1{print; next}
$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/' input.txt
Explicación
NR==1{print; next}
Esto imprime la primera línea (encabezado) incondicionalmente y pasa a la siguiente línea.
$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/
Esta es una expresión condicional: si los argumentos quinto y sexto coinciden con una sola letra mayúscula, entonces imprima la línea (el comando de impresión está implícito en este caso y es la instrucción predeterminada para cualquier condición).
$5
y $6
represente la quinta y sexta columna de cada línea.
&&
es el operador lógico Y.
~
es el operador de coincidencia de expresiones regulares. Devuelve verdadero si el argumento del lado izquierdo coincide con la expresión regular del lado derecho.
/^[A-Z]$/
es una expresión regular (regexp). El carácter "/" es un delimitador de la expresión regular, "^" indica el comienzo de una línea (o la cadena), "$" el final y "[AZ]" significa todas las letras mayúsculas de la A a la Z.
Respuesta2
awk '$5 ~ /^[ACGT]$/ && $6 ~ /^[ACGT]$/ || NR == 1' data.in
Esto, para los datos dados, generará
sample chr start end ref alt gene effect
AADA-01 chr1 12336579 12336579 C T VPS13D Silent
AADA-03 chr1 94548954 94548954 C A ABCA4 Missense
AADA-05 chr1 186076063 186076063 A T HM1 Silent
El awk
script prueba las columnas 5 y 6 para ver si contienen algún carácter único A
, C
o , G
o T
si la línea actual es la primera línea del archivo. Si es así, imprimirá esa línea.
La prueba $5 ~ /^[ACGT]$/
significa "ver si la columna cinco coincide con la expresión regular ^[ACGT]$
". La expresión regular coincidirá con cualquier cosa que contenga un solo carácter en el conjunto dado ( [ACGT]
).
^
y $
son "anclas", solo coincidirán al principio y al final (respectivamente) de los datos proporcionados (columna cinco y columna seis).
&&
y ||
son los operadores lógicos AND y OR.
NR
es el número ordinal de la línea de entrada actual. Si NR == 1
entonces la línea actual es la línea de encabezado del archivo. Dado que la línea de encabezado no cumple con los criterios que se deben generar ( ref
y alt
no son letras individuales y, por lo tanto, no coincidirían con la expresión regular), se debe realizar esta prueba por separado para asegurarse de incluirla en el resultado.
Respuesta3
perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in