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_number
você pode ver em perldoc perlapi
.
Responder2
Usando GNU grep
Você pode grep
fazer 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 -w
para contar palavras, estou contando as linhas acima, mas grep
retorna 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
egrep
funcionará:
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 awk
para 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