¿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_number
se puede ver en perldoc perlapi
.
Respuesta2
Usando GNU grep
Puede utilizar grep
para 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 -w
para contar palabras, estoy contando líneas arriba, pero grep
devuelve 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
egrep
trabajará:
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 awk
para 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