본문으로 이동

GNU Awk 사용자 가이드/함수

위키책, 위키책

함수란 입력받은 Input을 일정한 규칙에 따라 처리한 뒤 Output을 내놓는 것이다. 예를 들어 어떤 함수 x에 input을 넣었을 때 input값에 1만큼 증가한 값이 output으로 나온다면 이 함수는 +1을 해주는 함수라고 할 수 있다.

awk에서 함수는 보통 다음과 같은 기본형을 갖는다

 function(input1, input2, ...) {
   return
 }

input의 개수는 함수마다 다르며, 사용자 정의 함수의 경우 사용자가 필요한 만큼 지정해 줄 수 있다.

awk에서는 함수가 크게 두 부류로 나누어진다. 하나는 awk에 이미 내장되어 있는 내장함수(Built-In Function)인데, 이 함수들은 사용자가 원하는 경우 언제든지 불러와서 사용할 수 있다. 다른 하나는 사용자 정의 함수로서, 사용자가 프로그램의 목적에 따라 임의로 규칙을 만들어낸 함수를 가르킨다. 사용자 함수의 이름과 형식은 자유롭게 정할 수 있으나 이미 내장된 함수들의 이름을 사용할 수는 없다.

이 문서의 전반부는 awk에 내장된 함수들의 종류를 설명하고, 후반부에서는 사용자 정의 함수의 작성방법을 간단히 설명한다.

내장 함수

[+/-]

내장함수는 사용자가 만드는 awk프로그램에서 항상 사용할 수 있는 함수이다. awk의 내장 함수는 다섯 가지 정도로 분류된다.

Numeric Functions

[+/-]

Numeric Function은 수치 정보를 처리하는 함수들을 뜻한다. 아래의 목록은 awk에 내장된 수치 함수의 이름과 설명을 담고 있다.

함수명 설명
int(x) x에서 가장 가까운 정수 값을 return한다
sqrt(x) x의 양의 제곱근을 return
exp(x) x를 지수로, 자연상수 e를 밑으로 하는 지수함수 return
log(x) x의 자연로그값을 return
sin(x) x의 sin값을 return
cos(x) x의 cos값을 return
atan(y,x) x의 arctangent값을 return
rand() 0과 1사이의 범위에서 random number를 return
srand([x]) rand 기능과 관련하여 시작점이나 seed 설정

String-Manipulation Functions

[+/-]

문자열 함수는 하나 또는 여러 문자열의 text를 보거나, 변화시키는 기능을 갖고 있다. 아래의 목록은 문자열 함수의 이름과 기능을 나열한 것이다.

함수명 설명
asort#(source[,dest]) array source에서 요소들을 정렬해서 return
asorti(source[,dest]) rray source에서 요소들을 index를 기준으로 정렬해서 return
index(in,find) 주어진 string이 포함된 문자열을 검색해서 return
length(string) 주어진 input의 철자 수를 세서 return
match(string, regexp, [, array]) string에서 regular expression의 위치를 return
split(string,array,[,fieldsep]) fieldsep에 따라 string을 쪼개고 각각을 저장
sprintf(format, expression1,...) printf와 같은 용도이지만 값을 return하기만 할 뿐 출력하지 않는다
strtonum(str) 문자열을 숫자로 변환, 문자열의 종류에 따라 8진수,16진로 파악하기도 함
sub(regexp, replacement[, target]) regexp에 해당하는 문자열을 replace로 대치시킴
gsub(regexp, replacement[, target]) 매치되는 모든 string을 replace로 대치시킴
gensub(regexp, replacement[, target]) original string의 값이 변하지 않은 채로 매치되는 값들만 return
substr(string, start[, length]) start에서 시작해 length만큼의 길이까지 문자열을 return한다
tolower(string) 해당 문자열의 대문자를 소문자로 바꿔서 출력
toupper(string) 해당 문자열의 소문자를 대문자로 바꿔서 출력

Input/Output Function

[+/-]

입출력 데이터와 관련된 함수들의 목록은 아래와 같다.

함수명 설명
close(filename [,how]) filename에 해당하는 파일을 닫는다
system(command) operating-system의 명령어를 실행하고 이를 awk에 return
getline() 처리된 output을 다음 레코드의 input으로 받는다.
printf() 내용을 그대로 return하면서 안에서 변수를 순서대로 받아 입력한 string과 같이 출력

Time Functions

[+/-]

awk에서 제공하는 시간정보 관련 함수이다.

함수명 설명
systime() 현재시간을 초단위까지 return
mktime(datespec) systime으로부터 받은 시간을 dataspec에 입력
strftime([format[,timestamp[,ufc-flag]]]) ufc-flag에서 받은 시각(표준시각)을 문자로 표현, 기본 포맷인 경우 '%a,%A...'와 같은 문자열로 출력된다.

Bit-Manipulation Functions

[+/-]

비트값을 처리하는 Function으로써 불 대수값을 출력하는 함수와 자리를 이동하며 처리하는 함수로 구성된다. 목록은 다음과 같다.

함수명 설명
and(v1,v2) 입력된 값들의 AND연산 값 출력 1 1인 경우 1출력
or(v1,v2) 입력된 값들의 or연산 값 출력 0 0인 경우를 제외하고 1출력
xor(v1,v2) 입력된 값들의 xor연산 값 출력, 1 0 또는 0 1인 경우 1 출력
lshift(val) 카운트된 bit만큼 왼쪽으로 이동한 값을 return
rshift(val) 카운트된 bit만큼 오른쪽으로 이동한 값을 return

사용자 정의 함수

[+/-]

사용자 정의 함수는 awk 프로그램의 내부 어디에서든 만들고 사용할 수 있다. 일단 프로그램 내에서 함수가 정의된 후에는 다시 정의하지 않고 바로 적용하여 편리하게 사용할 수 있다.

함수의 기본 정의방식

[+/-]

awk에서 함수는 보통 다음과 같은 형식으로 만들어진다.

 function name(parameter1, parameter2, ...) {
		body-of-function
 }

name은 함수의 이름을 가리키고, parameter는 함수에 들어가는 input을 의미한다. body of function은 본격적인 함수의 내용을 가리킨다.

함수의 예시

[+/-]

m부터 n까지를 더한 결과값을 내는 함수를 sum(m, n)의 소스 코드는 아래와 같다

function sum(start, end) { 
	total = 0;
	for (i = start; i<= end; i++) {
		total = total + i;
	}
	return total;
}

위와 같이 프로그램 내에서 함수를 정의한 후 그 다음부터는 같은 연산이 필요할 때마다 함수로 간단하게 입력해서 사용할 수 있다.