AWK - 함수를 사용하여 파일의 모든 숫자를 계산하는 방법

AWK - 함수를 사용하여 파일의 모든 숫자를 계산하는 방법

함수를 사용하지 않으면 패턴이 작동하기 때문에 약간 혼란스럽습니다. 그러나 반면에 그렇지 않습니다.

입력 파일:

asd
111
22
3333
mike
44444
mas

내 awk 기능: (항상 4 대신 1을 인쇄합니다)

function A(){
/[0-9]/ number++
print number
}

END{
A()
}

함수 외부에서 사용하면 1패턴이 작동 하지만 내부에서는 항상 인쇄됩니다. 문제가 무엇입니까?

답변1

/[0-9]/일반적으로 이러한 패턴은 사용되지 않습니다.~에블록. 그들은 다음과 같이 더 일반적으로 사용됩니다.

pattern { block }

함수 내부의 문자열에 대해 정규식을 테스트하려면 다음을 사용하세요 match().

function A() {
    if (match($0, "[0-9]"))
        ++number
}

{
    A()
}

END {
    print number
}

A()각 행을 호출하여 최소한 하나의 숫자를 포함하는 행 수를 계산합니다. 이 함수는 정규식을 줄의 내용과 일치시키고 A()일치 하면 1씩 증가시킵니다. 이 블록은 실행이 끝나면 결과를 인쇄합니다 .[0-9]numberENDnumber

if (match($0, "[0-9]"))대신 사용할 수도 있지만 if (/[0-9]/)match()유연합니다.

awk프로그램과 동일한 효과를 가집니다.

/[0-9]/ { ++number }

END     { print number }

어딘가에 숫자가 포함된 행 수가 아닌 양의 정수만 포함된 행 수를 계산하려면 ^[0-9]+$정규 표현식으로 사용하세요.

중요한 점은 A()각 입력 라인에 대해 함수를 호출해야 하고 number변수 값을 블록에 인쇄해야 한다는 것입니다 END.


다음과 같은통사론받아들여졌다POSIX awk구문하지만 프로그램은아니요숫자가 포함된 행 수를 계산하지만 행도 계산합니다.

function A() {
    /[0-9]/ ++number
}

{
    A()
}

END {
    print number
}

이 명령문은 /[0-9]/ ++number결과와 연결된 문자를 평가 0하거나 1(현재 줄이 일치하는지 여부에 따라) ++number문자열로 평가합니다.

A()블록에서 함수만 호출하기 때문에 END함수 number는 한 번만 증가하므로 항상 1출력을 얻게 됩니다.

관련 정보