Looping através de colunas e linhas para contar valores específicos

2

Eu tenho um arquivo com cerca de 27.000 colunas e 40.000 linhas. Preciso contar o número de 0.0 s em cada coluna e em cada linha dos dados. Escrevi o código a seguir para contar e imprimir o número de 0.0 s em cada coluna:

awk '{a[$1]++;} END{for(i in a) print a[i]"  "i}' file_name.txt

Eu tentei integrar o seguinte código:

awk -F, '{ for(i=NF; i>=2; --i) printf "%s ", $i; print $1 }' file_name.txt

para criar um loop no qual todos os 0.0 s foram contados e impressos. No entanto, não obtive êxito e não consigo encontrar mais nada que me ajude a atingir minha meta. Não é necessário criar um arquivo de saída para os números finais.

    
por Danielle 24.10.2018 / 06:10

2 respostas

2

Semelhante a minha resposta recente , mas aqui precisamos verificar se o valor do campo é igual a 0.0 e contar a coluna e as linhas em uma matriz separada em vez de sum-up, então:

awk '{
    for (i=1; i<=NF; i++) {
        if ($i=="0.0") { zero_in_column[i]+= 1 ; zero_in_row[NR]+= 1 }; }
}
END { for (X in zero_in_row)
         print "in_row:"X, zero_in_row[X], "in_column:" X, zero_in_column[X]
}' OFS='\t' infile

Observação: substitua zero_in_row array por zero_in_column em END { for (X in zero_in_row) if number_of_column > number_of_rows.

para a entrada como abaixo ( e eu tive END { for (X in zero_in_column) , pois minha contagem de colunas é maior que a contagem de linhas ):

1    0.0  3    0.0  4    0.0  0.0
3    4    5    0.0  0.0  0.0  0.0
0.0  0.0  0.0  0.0  0.0  0.0  0.0

A saída é:

in_row:1        4       in_column:1     1
in_row:2        4       in_column:2     2
in_row:3        7       in_column:3     1
in_row:4                in_column:4     3
in_row:5                in_column:5     2
in_row:6                in_column:6     3
in_row:7                in_column:7     3
    
por 24.10.2018 / 07:49
2

Por que não (pequena adaptação à proposta do devWeek, não testado ):

awk '
        {ROWCNT = 0
         for (i=1; i<=NF; i++) if ($i == "0.0")  {COLCNT[i]++
                                                  ROWCNT++
                                                 }
         print "Row", NR,":", ROWCNT
        } 
END     {for (i=1; i in COLCNT; i++) print "Col", i,":", COLCNT[i]
        }
' file

para manter a ordem das linhas de entrada, pois a ordem em que os elementos da matriz são recuperados não está definida.

    
por 24.10.2018 / 10:38