Usar Perl para contar la cantidad de números científicos en un archivo

Usar Perl para contar la cantidad de números científicos en un archivo

¿Cómo puedo contar la cantidad de números científicos en un archivo? El archivo también tiene algunas líneas de encabezado que deben omitirse.

Una parte del contenido del archivo se encuentra a continuación.

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

Entonces, ¿cómo puedo omitir las primeras cuatro líneas del ejemplo anterior y contar la cantidad de números científicos en el archivo?

Respuesta1

Con el módulo principal Scalar::Util, puedes hacer:

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

Más sobre looks_like_numberse puede ver en perldoc perlapi.

Respuesta2

Usando GNU grep

Puede utilizar greppara hacer esto, utilizando las instalaciones PCRE. Por cierto, el mismo patrón también se puede utilizar en Perl:

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

También puedes usarlo wc -wpara contar palabras, estoy contando líneas arriba, pero grepdevuelve una sola coincidencia en una línea, por lo que realmente no importa en ese escenario.

Usando Perl

Para Perl puedes usar este delineador:

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

Referencias

Respuesta3

egreptrabajará:

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

ACTUALIZAR:

Si una línea contiene tanto un número como alguna otra cadena, podemos usar awkpara resolver el 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 )

Respuesta4

Si necesita simplemente contar el número decampos delimitados por espacios en blancosiguiendo las líneas del encabezado en Perl, creo que podrías hacer

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

Si realmente necesita contar sólo números con formato científico, entonces una solución podría ser buscar y reemplazar números segúnuna expresión regular adecuaday luego cuente el número de reemplazos (la expresión de sustitución de Perl devuelve el número de reemplazos cuando la vincula a una variable)

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

información relacionada