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 quatro primeiras linhas do exemplo acima e contar o número de números científicos no arquivo?
looks_like_number
Usando o GNU grep
Você pode
grep
fazer isso usando as instalações do PCRE. Aliás, o mesmo padrão também pode ser usado no Perl:Você também pode usar
wc -w
para contar palavras, estou contando as linhas acima, masgrep
retorna uma única correspondência em uma linha, para que realmente não importe nesse cenário.Usando Perl
Para Perl, você pode usar este liner:
Referências
fonte
egrep
irá funcionar:ATUALIZAR:
se uma linha contiver um número e outra string, podemos usar
awk
para resolver o problema:fonte
-oP
opção mencionado na resposta SLM antes, mas eu fixo meu problema usandoawk
@JohnnySupondo que você tenha apenas números científicos após a quarta linha, você pode fazer algo como abaixo.
Para a entrada que você forneceu, a saída é 33 depois de executar o comando acima.
fonte
Se você precisar simplesmente contar o número de campos delimitados por espaço em branco após as linhas de cabeçalho em perl, acho que você poderia simplesmente
Se você realmente precisar contar apenas números formatados cientificamente, uma abordagem pode ser procurar e substituir números de acordo com uma regex adequada e contar 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 )
fonte
Tudo se resume ao que você realmente deseja considerar um número científico , o que você pode esperar que sua entrada contenha e onde você pode aceitar encontrar esses números na entrada.
Por exemplo, em:
Posso encontrar os números 0 ou 2 (inf e 2E2000) ou 3 (inf, 2E200, 0) (ou levados ao extremo, procurando todas as sequências de caracteres que formam um número válido: 17 (inf, 2, 2E2, 2E20, 2E200, 2E200, 2E2000, 2, 20, 200, 2000, 0, 00, 000, 0, 00, 0)).
Se você sabe que sua entrada possui apenas números no X.XXXXXXXXE-XXX, e que eles estão com suas próprias palavras, pode ser mais seguro procurar apenas isso em palavras inteiras como:
A idéia é obter uma palavra por linha e combinar a linha inteira (
-x
) com o padrão desejado. Para permitir qualquer número de notação cientifico (-1,2e + 1234 ... contanto que haja ume
ouE
), você pode alterar o padrão para:Ou torne a
e...
peça opcional para permitir todos os tipos de números decimais de ponto flutuante:Isso tudo dá a mesma resposta para sua entrada específica, mas onde isso faria diferença é onde há entrada que se afasta do padrão estrito mostrado em sua amostra.
fonte