如何计算文件中科学数字的数量?该文件还有几行需要跳过的标题。
文件内容的一部分如下所示。
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
那么,如何跳过上面示例的前四行并计算文件中科学数字的数量?
答案1
使用核心模块Scalar::Util
,您可以执行以下操作:
$ perl -MScalar::Util=looks_like_number -anle '
$count += grep { looks_like_number($_) } @F;
END { print $count }
' file
33
更多相关内容looks_like_number
可以参见perldoc perlapi
。
答案2
使用 GNU grep
您可以grep
使用 PCRE 工具来执行此操作。顺便说一句,同样的模式也可以在 Perl 中使用:
$ grep -oP '\d+E[-+]?\d+' file.txt | wc -l
33
您还可以使用wc -w
来计算单词数,我正在计算上面的行数,但是grep
返回一行上的单个匹配项,因此在这种情况下它并不重要。
使用 Perl
对于 Perl,你可以使用这个衬垫:
$ perl -lane '$c += grep /\d+E[-+]?\d+/, @F; END { print $c; }' file.txt
33
参考
答案3
egrep
将工作:
egrep "[0-9].[0-9]E-[0-9]" YourFile | wc -w
更新:
如果一行恰好包含数字和其他字符串,我们可以使用以下方法awk
来解决问题:
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 )
答案4
如果您需要简单地计算数量空格分隔的字段按照 perl 中的标题行,我认为你可以这样做
perl -lane '$sum += $#F+1 if $. > 4; END{print $sum}' file
如果您确实只需要计算科学格式的数字,那么一种方法可能是根据以下内容搜索和替换数字合适的正则表达式然后计算替换次数(当您将 perl 替换表达式绑定到变量时,它会返回替换次数)
perl -lane '$sum += s/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?//g if $. > 4; END{print $sum}' file