¿Cómo obtener todas las columnas basadas en dos columnas usando awk?

¿Cómo obtener todas las columnas basadas en dos columnas usando awk?

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

$5y $6represente 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 awkscript prueba las columnas 5 y 6 para ver si contienen algún carácter único A, Co , Go Tsi 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.

NRes el número ordinal de la línea de entrada actual. Si NR == 1entonces 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 ( refy altno 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

información relacionada