apaga linhas que somam zero

2

Eu preciso excluir todas as linhas em um arquivo, se os valores em todas as colunas forem 0 (portanto, se a soma da linha for 0).

Meu arquivo é assim (13 colunas e 60000 linhas, delimitado por tabulações)

KO  gene    S10 S11 S12 S1  S2  S3  S4  S5  S6  S7  S8  S9
K02946  aap:NT05HA_2163 0   0   0   0   1   0   8   0   0   5   0   0
K06215  aar:Acear_1499  0   0   0   0   0   0   8   0   0   0   0   0
K00059  acd:AOLE_11635  0   0   5   0   0   0   0   0   8   0   0   0
K00991  afn:Acfer_0744  0   0   0   0   0   0   0   0   0   0   0   0
K01784  aha:AHA_2893    0   0   0   0   0   0   7   0   0   0   0   0
K01497  amd:AMED_3340   0   0   0   0   0   0   0   0   0   0   0   0

Como posso fazer?

    
por Francesca de Filippis 29.11.2014 / 20:43

2 respostas

3

Se você quiser awk solution:

awk '{s=0; for (i=3;i<=NF;i++) s+=$i; if (s!=0)print}' infile > outfile

Se você gosta de permanecer na primeira linha como script de início de cabeçalho a partir do segundo:

awk 'NR > 1{s=0; for (i=3;i<=NF;i++) s+=$i; if (s!=0)print}' infile > outfile
    
por 29.11.2014 / 20:50
3

Se suas colunas contiverem apenas números não negativos, você só precisará imprimir uma linha com pelo menos um campo com um número maior que 0.

com perl :

$ perl -MList::Util=first -anle '
  print if first {$_ > 0} @F or $. == 1;
' file
KO  gene    S10 S11 S12 S1  S2  S3  S4  S5  S6  S7  S8  S9
K02946  aap:NT05HA_2163 0   0   0   0   1   0   8   0   0   5   0   0
K06215  aar:Acear_1499  0   0   0   0   0   0   8   0   0   0   0   0
K00059  acd:AOLE_11635  0   0   5   0   0   0   0   0   8   0   0   0
K01784  aha:AHA_2893    0   0   0   0   0   0   7   0   0   0   0   0

Você deve ler esta pergunta por motivos de segurança se usar perl solution.

com awk :

$ awk 'FNR == 1{print;next}{for(i=3;i<=NF;i++) if($i > 0){print;next}}' file
    
por 29.11.2014 / 21:03