
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).
$5
e $6
representam 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 awk
script testa as colunas 5 e 6 para ver se elas têm algum caractere único A
, C
, G
ou 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 == 1
entã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 ( ref
e alt
nã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