使用 Perl 计算文件中科学数字的数量

AFP*_*FPP 10 perl

如何计算文件中科学数字的数量?该文件还有几行标题需要跳过。

文件内容的一部分在下面。

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
Run Code Online (Sandbox Code Playgroud)

那么,如何跳过上面示例的前四行并计算文件中科学数字的数量?

cuo*_*glm 14

使用 core module Scalar::Util,您可以执行以下操作:

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

更多关于looks_like_number可以看到perldoc perlapi


slm*_*slm 7

使用 GNU grep

您可以使用grepPCRE 工具来执行此操作。顺便提一下,在 Perl 中也可以使用相同的模式:

$ grep -oP '\d+E[-+]?\d+' file.txt  | wc -l
33
Run Code Online (Sandbox Code Playgroud)

您也可以使用wc -w来计算单词,我正在计算上面的行数,但grep返回一行上的单个匹配项,因此在这种情况下并不重要。

使用 Perl

对于 Perl,您可以使用这一行:

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

参考


Ram*_*esh 3

假设第四行之后只有科学数字,您可以执行如下操作。

tail -n +5 filename | wc - w
Run Code Online (Sandbox Code Playgroud)

对于您提供的输入,运行上述命令后输出为33 。