awk script para contar o 0 em cada linha e imprimir as linhas que possuem menos de 20% de zeros nele. A contagem de 0 começa do quarto campo em cada linha

0
 Chr     Position1       Position2       S1      S2      S3      S4      S9      S11     S14     S15     S16     S17     S18     S19     S28     S29     S30     S33     S34     S35     S36     S37     S38
Aradu.A01       100145549       100145556       AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA
Aradu.A01       100246832       100246837       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100246837       100246846       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100345681       100345688       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100408092       100408119       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100408119       100408137       0       0       0       TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      0
Aradu.A01       100425855       100425856       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100425856       100425857       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100431071       100431075       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       10051925        10051981        GT      GT      0       0       GT      0       0       0       0       0       0       GT      GT      GT      0       0       0       GT      GT      0
Aradu.A01       100616716       100616718       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100616718       100616750       0       0       0       0       0       0       CT      0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100757232       100757233       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       100761215       100761271       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
Aradu.A01       10078917        10078920        CT      0       0       CC      0       CC      CC      CC      0       CC      CC      CC      0       CC      0       0       0       0       CT      0

A seguir, o que tentei:

awk '{ for (i=4; i<=NF; i++){if ($i=0) {count++}} print $0"\t"count}' input_file|less -S  
    
por gaurav agarwal 04.05.2017 / 16:57

1 resposta

2

O que você tem é próximo, mas imprime apenas cada registro seguido da contagem cumulativa de zeros para cada registro, em vez do que você pede.

awk '{ zeroes=0; for( i=4; i<NF; i++ ) { if( $i == 0 ) {zeroes++} } if( zeroes / (NF-3) < 0.2 ) { print $0 } }' /path/to/input

Ligeiramente mais legível:

{
  zeroes=0
  for( i=4; i<NF; i++ ) {
    if( $i == 0 ) {
      zeroes++
    }
  }
  if( zeroes/(NF-3) < 0.2 ) {
    print $0
  }
}

A lógica deve ser bastante autoexplicativa.

    
por 04.05.2017 / 17:52

Tags