awk, a função de aspas (") na seleção de números? (Linux)

4

Eu tenho uma tabela de entrada, parcialmente:

TCTTTTAAAGCCTCCTCAACTGTTTTAGGG  1       0
CACAACTGAAAAGTACAATGTGTTTGCTTC  1       0
CACCATATTTATTTAAAGGAGCATCTAAAT  1       3
ACGAGAAAAAAAAAAGGGGTGACCCCCTGG  3       0
CAAAATATTAATTCTTTACTATGAAACTTA  1       0
TTCTATTTTGTCGTGGTTAGCAACCATCAC  6       5
TAATAATAAAATAATGAAAAAGAAAAATCA  1       0
AAAGCATTTGAAGGTGACAAAAGGGAAAGT  20      7
TGCTAAGGAAGAATCATGGAAGAGTGTTTT  0       1
CTCCCTTCCTCGCAAACATGCTTGCCCAGG  0       1
AATAAAAATCAAATTTAGTGACGGGTTGAG  130     4
AGAACGAAGCTGATATAAAGACATCAAAGA  1       0
TGCCCCTAATGCAGCATCTCTCTCTCCCTC  1       0
CCACAAAATAATTACATGGCAAACACGAGT  1       0

Eu quero imprimir todas as linhas com coluna 3 > = 120 e coluna 2 > = 420

Eu tenho dois resultados diferentes usando e não usando "" ao redor do número.

(A) awk '$3>=120 && $2>=420 {print $0}'

(B) awk '$3>="120" && $2>="420" {print $0}'

Resultado de (A) parcialmente, o que parece ser o que eu quero:

GTGTCATTTCATGCCTCATTCATCCTCATT  1375    439
TGAATTCTATTACTTGATTGACATTGACAG  541     301
TCTTTGGCGGTTGTTAAAGAATTTTCTGAT  823     203
TCTACACCTCAATATGCAAAACATTACATC  535     165
TTCAACAAATTAATTAAAATTGAATTAAAC  3010    627
GATATGTAAAAAAAATTATATTATATGAAT  609     173

Resultado de (B) parcialmente, não é o que eu quero:

TAATAATAATAATAAAAGAAGAAGAAAAGA  5       2
TATCTGAGCTATCAACTCAATTCATCGTCG  5       4
TTAATGATAAATTTATCTTAAAAGTTTAAC  62      23
TTCAACCCCCTCTCCTGGTGTGTGCCCTAG  45      7
TCCAAAGCCTTTAATGTGTACCGCGTGAAA  6       5
GGCAATGGGATACTCCTGTATGTTATTCTA  6       3

A pergunta vem à minha mente: Como as aspas (") na seleção de números fizeram a diferença?

Muito obrigado.

    
por Johnny Tam 21.09.2017 / 02:58

2 respostas

7

Aspas forçam uma comparação na representação de string dos seus números. Alfabeticamente, "42" vem depois de "120" (você tem "42" > "120"); numericamente não (você então tem 42 < 120).

    
por 21.09.2017 / 03:04
3

Execute as comparações sem as aspas, ou elas serão comparações de sequência que são realizadas lexicograficamente.

O minúsculo script awk pode ser ainda mais reduzido em tamanho, permitindo que a ação padrão seja executada. A ação padrão para um teste condicional que não possui um bloco {...} é imprimir a linha de entrada atual:

awk '$2>=420 && $3>=120' data.in
    
por 21.09.2017 / 21:59

Tags