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위의 I'm counting line을 사용하여 단어 수를 셀 수도 있지만 , grep이 경우 한 줄에 일치하는 항목이 하나만 반환되므로 이 경우에는 중요하지 않습니다.

펄 사용하기

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

관련 정보