함수를 사용하지 않으면 패턴이 작동하기 때문에 약간 혼란스럽습니다. 그러나 반면에 그렇지 않습니다.
입력 파일:
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]
number
END
number
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
출력을 얻게 됩니다.