Como obter todas as colunas com base em duas colunas usando o awk?

Como obter todas as colunas com base em duas colunas usando o awk?

Eu tenho um arquivo 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

Preciso de todas as linhas onde a 5ª e a 6ª colunas contenham apenas um caractere.

E o resultado deverá ficar assim:

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

Eu tentei usar isso.

awk -F'\t' '$5' filename | awk -F'\t' '$6' filename | wc -l

Eu sei que isso está errado, mas alguém pode corrigir meu erro, por favor.

Responder1

awk 'NR==1{print; next}
     $5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/' input.txt

Explicação

NR==1{print; next}

Isso imprime a primeira linha (cabeçalho) incondicionalmente e vai para a próxima linha.

$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/

Esta é uma expressão condicional: se o 5º E o 6º argumentos corresponderem a uma única letra maiúscula, imprima a linha (o comando print está implícito neste caso, sendo a instrução padrão para qualquer condição).

$5e $6representam a 5ª e a 6ª colunas de cada linha.

&&é o operador lógico AND.

~é o operador de correspondência regexp. Ele retorna verdadeiro se o argumento do lado esquerdo corresponder ao regexp do lado direito.

/^[A-Z]$/é uma expressão regular (regexp). O caractere "/" é um delimitador para o regexp, "^" indica o início de uma linha (ou string), "$" o final e "[AZ]" significa todas as letras maiúsculas de A a Z.

Responder2

awk '$5 ~ /^[ACGT]$/ && $6 ~ /^[ACGT]$/ || NR == 1' data.in

Isso irá, para os dados fornecidos, gerar

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

O awkscript testa as colunas 5 e 6 para ver se elas têm algum caractere único A, C, Gou T, ou se a linha atual é a primeira linha do arquivo. Nesse caso, ele imprimirá essa linha.

O teste $5 ~ /^[ACGT]$/significa "ver se a coluna cinco corresponde à expressão regular ^[ACGT]$". A expressão regular corresponderá a qualquer coisa que contenha um único caractere no conjunto fornecido ( [ACGT]).

^e $são "âncoras", elas corresponderão apenas no início e no final (respectivamente) dos dados fornecidos (coluna cinco e coluna seis).

&&e ||são os operadores lógicos AND e OR.

NRé o número ordinal da linha de entrada atual. Se NR == 1então a linha atual for a linha de cabeçalho do arquivo. Como a linha do cabeçalho não atende aos critérios de saída ( refe altnão são letras únicas e, portanto, não corresponderiam à expressão regular), esse teste separado deve ser feito para garantir que ela seja exibida na saída.

Responder3

perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in

informação relacionada