Использование 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

Связанный контент