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 사용

grepPCRE 기능을 사용하여 이를 수행 할 수 있습니다 . 덧붙여서 Perl에서도 동일한 패턴을 사용할 수 있습니다.

$ grep -oP '\d+E[-+]?\d+' file.txt  | wc -l
33

단어 수를 세는 데 사용할 수도 있습니다 wc -w. 위의 줄을 세고 있지만 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

관련 정보