使用Perl計算文件中科學數字的數量

使用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

那麼,如何跳過上面範例的前四行併計算文件中科學數字的數量?

答案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

相關內容