Usando Perl para contar o número de números científicos em um arquivo

Usando Perl para contar o número de números científicos em um arquivo

Como posso contar o número de números científicos em um arquivo? O arquivo também possui algumas linhas de cabeçalho que precisam ser ignoradas.

Uma parte do conteúdo do arquivo está abaixo.

FileHeaderLine1
FileHeaderLine2
FileHeaderLine3
FileHeaderLine4
2.91999996E-001 2.97030300E-001 3.02060604E-001 3.07090908E-001 3.12121212E-001 3.17151517E-001
3.22181821E-001 3.27212125E-001 3.32242429E-001 3.37272733E-001 3.42303038E-001 3.47333342E-001
3.52363646E-001 3.57393950E-001 3.62424254E-001 3.67454559E-001 3.72484863E-001 3.77515137E-001
3.82545441E-001 3.87575746E-001 3.92606050E-001 3.97636354E-001 4.02666658E-001 4.07696962E-001
4.12727267E-001 4.17757571E-001 4.22787875E-001 4.27818179E-001 4.32848483E-001 4.37878788E-001
4.42909092E-001 4.47939396E-001 4.52969700E-001

Então, como posso pular as primeiras quatro linhas do exemplo acima e contar a quantidade de números científicos no arquivo?

Responder1

Com o módulo principal Scalar::Util, você pode fazer:

$ perl -MScalar::Util=looks_like_number -anle '
    $count += grep { looks_like_number($_) } @F;
    END { print $count }
' file
33

Mais sobre looks_like_numbervocê pode ver em perldoc perlapi.

Responder2

Usando GNU grep

Você pode grepfazer isso usando os recursos do PCRE. Aliás, o mesmo padrão também pode ser usado em Perl:

$ grep -oP '\d+E[-+]?\d+' file.txt  | wc -l
33

Você também pode usar wc -wpara contar palavras, estou contando as linhas acima, mas grepretorna uma única correspondência em uma linha, então isso realmente não importa nesse cenário.

Usando Perl

Para Perl você poderia usar este liner:

$ perl -lane '$c += grep /\d+E[-+]?\d+/, @F; END { print $c; }' file.txt 
33

Referências

Responder3

egrepfuncionará:

egrep "[0-9].[0-9]E-[0-9]" YourFile | wc -w

ATUALIZAR:

se uma linha contiver um número e alguma outra string, podemos usar awkpara resolver o problema:

awk -F' ' '{for(i=1;i<=NF;i++)if(!(i%1))$i=$i "\n"}1' YourFile | egrep "[0-9].[0-9]E-[0-9]" | wc -w ( or wc -l )

Responder4

Se você precisar simplesmente contar o número decampos delimitados por espaços em brancoseguindo as linhas do cabeçalho em perl, acho que você poderia fazer

perl -lane '$sum += $#F+1 if $. > 4; END{print $sum}' file

Se você realmente precisa contar apenas números formatados cientificamente, uma abordagem pode ser pesquisar e substituir números de acordo comum regex adequadoe então conte o número de substituições (a expressão de substituição perl retorna o número de substituições quando você a vincula a uma variável)

perl -lane '$sum += s/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?//g if $. > 4; END{print $sum}' file

informação relacionada