<Built-in functions>
Arithmetic functions
cos(x):                         cos(x)를 반환.
exp(x):                         e^x를 반환 (e는 natural log base).
int(x):                           x를 버림하여 정수로 변환.
log(x):                          log x를 반환 (base-e).
sin(x):                          sin(x)를 반환.
sqrt(x):                         루트 x를 반환.
atan2(y,x):                    arctan(y/x)를 반환.
rand():                          random number를 반환.
srand(x):                       random number generator의 seed를 x로 변환.

String functions
gsub(r,s,t):                   string t에서 regular expression r의 pattern에 match되는 모든 문자열을
                                   s로 변환한다. (t는 생략가능 (default = $0)) 
index(s,t):                    string s에서 substring t의 위치를 반환(c.f. C programming과는 달리
                                   string의 첫 문자는 위치는 1번부터 시작, 해당 substring이 없을 경우
                                   index function은 0을 반환)
length(s):                     string s의 길이를 반환 (s는 생략가능 (default = $0))
match(s,r):                   string s에서 regular expression r이 시작되는 위치를 반환, match되는
                                   것이 없다면 0을 반환. (c.f. 이 이외에도 match function은 RSTART (r이
                                   시작되는 위치, RLENGTH (r에 해당하는 문자열의 길이), 두 개의
                                   system varaible을 set 해준다.)
split(s,a,sep):               string s를 field separator sep을 통해 나누고, 이를 array a에 저장한다.
                                   반환 값은 나누어진 field의 개수.
sprintf("fmt", expr):         printf function을 사용하여 expr을 출력했을때의 문자열을 반환.
sub(r,s,t):                     string t에서 regular expression r의 pattern에 match되는 첫번째 문자열
                                   을 s로 변환한다. (t는 생략가능 (default = $0)) 만약 성공하면 1을 반환, 
                                   match되는 문자열이 없다면 0을 반환.
substr(s,p,n):                string s에서 position p부터 시작, length n인 substring을 반환. (n은 생
                                   략 가능, 생략할 경우 p부터 s의 끝까지의 substring을 반환)
tolower(s):                    string s의 upper-case character를 lower-case로 변환하여 반환.
toupper(s):                    string s의 lower-case character를 upper-case로 변환하여 반환.


<User defined-function>
awk programming시 user가 function을 만들어 줄 수 있다.
function의 사용법은 C programming과 매우 유사하다.

function name(parameter_list) {
statements;
}

그리고 function을 선언과 그 내용은 보통 awk program의 상단에 위치한다.

C program과 단 한가지 차이점이 있다면
awk에서는 function의 parameter를 제외하고는 모두 global variable로 인식한다는 것이다.
awk program에서 function안에서 사용하는 variable은 모두 global variable이다.
즉, function 밖에서 사용하던 variable을 function 안에서 사용이 가능하고,
function 안에서 사용한 variable은 밖의 variable에 그 영향을 미치게 된다.

하지만 function의 parameter의 경우 local variable로 쓰이게 된다.
그래서 사용하는 방법이
function의 parameter 끝 부분에 local temporary variable을 삽입하는 것이다.
awk에서는 function의 parameter의 개수와 function call시 parameter의 개수가 같지 않더라도 function call시 parameter의 개수가 더 적다면,
function의 parameter의 첫번째 parameter부터 차례로 parameter를 지정해주게 된다.
이를 이용하여 function caller가 넘겨줄 parameter가 3개고, function 내부의 local variable이 2개라면
function을 선언해 줄 때, 5개의 parameter (parameter 3개 + local variable 2개)를 선언하고,
function을 call 할 땐, 앞의 3개 parameter만 사용하는 것이다.

다음은 이를 확인하는 예제이다.

# insert .awk
function insert (STRING, POS INS, before_tmp) {
before_tmp = substr(STRING, 1, POS);
after_tmp = substr(STRING, POS+1);
return before_tmp INS after_tmp;
}

#main routine
{
print "Function returns", insert($1, 4, "XX");
print "The value of $1 after is:", $1;
print "The value of STRING is:", STRING;
print "The value of before_tmp is:", before_tmp;
print "The value of after_tmp is:", after_tmp;
}

이를 다음과 같이 실행하면

$ echo "Hello" | awk -f insert.awk -

그 결과는 다음과 같다.

Function returns HellXXo
The value of $1 after is: Hello
The value of STRING is:
The value of before_tmp is:
The value of after_tmp is: o

즉, 여기서 before_tmp의 경우 local variable로 function에 선언되어 있으므로 그 값이 function의 밖에서는 알 수 없고, after_tmp의 경우 global variable로 사용되었으므로(function의 parameter에 선언이 안됐으므로) 그 값이 function의 외부에서도 알 수 있는 것을 확인할 수 있다.


Posted by sunshowers
,