awk에서 array의 사용법은 C programming에서 사용하는 것과 같이

array[subscript] = value;

방법이 동일하다.


하지만 awk에서의 array는 다른 language와는 다르게 associative array이다.

기존의 C나 java에서 사용하는 array의 경우 numeric array로 array의 index로 integer밖에 사용하지 못했다.

하지만 awk에서는
array의 index로 integer가 아닌 string이나 실수를 사용할 수 있다.
예를 들어 color["red"] = "cherry" 가 가능하다는 것이다.

이러한 awk의 feature는 array의 사용을 매우 광범위하게 늘려주지만,
동시에 array의 index를 관리할 때, numberic index와 string index를 명확히 구분해 줄 필요가 있다.
여기서 알아두어야 할 점이 awk에서는 모든 numeric index를 string으로 변환하여 관리한다.
이를 예를 들어 확인해보면

arr[4] = arr[04]       - 이 둘은 둘다 numeric array로 서로 같다.
arr["4"] = arr[4]      - 오른쪽의 index 4를 "4"인 string으로 변환하기 때문에 이 둘은 같다.
arr["4"] = arr[04]     - 오른쪽의 index 04를 numeric 4로 받아 들인 다음, "4"인 string으로 변환하
                               기 때문에 이 둘은 같다.
arr["04"] != arr[4]    - 오른쪽의 index 4를 "4"인 string으로 변환하기 때문이 디 둘은 다르다.
arr["04"] != arr[04]   - 오른쪽의 index 04를 numeric 4로 받아 들인 다음, "4"인 string으로 변환하
                               기 때문에 이 둘은 다르다.

또 이런한 associative array의 특성을 위하여
아래와 같이 특별한 종류의 for loop이 존재한다.

for (item in array) {
action with item
}

이 구문을 사용하는 예를 들면 다음과 같다.

{
color["red"] = "cherry";
color["green"] = "melon";
color["blue"] = "sea";
for (i in color)
         print i, color[i];
}

이를 실행하면 다음과 같은 결과를 얻는다.

red cherry
green melon
blue sea


비슷하게 conditional statement에 들어갈 수 있는 condition으로

item in array

가 있는데, 만약 해당 item이 array의 index에 존재한다면 true를 아니면 false를 return한다.
예를 들어

if ("BASIC" in acro)
print "Found BASIC"

위와 같이 사용할 수 있다.


Array에서 하나의 element를 제외하기 위해서는 delete statement를 쓰면 된다.

delete array[subscript]

이렇게 하면 subscript에 해당하는 index를 가지는 array element는 array로부터 제외되게 된다.


Multidimensionnal array도 사용이 가능하다.

array[subscript1, subscript2, ...] = value;


C programming에서 처럼 command line에서 awk를 실행할 때 받은 입력을 저장하는 system variable이 다음과 같이 있다.
ARGV:       command line에서 받은 입력이다. (c.f. awk script와 이에 해당하는 option은 제외)
ARGC:       command line에서 받은 입력의 개수.

이를 사용한 예를 보면

BEGIN {
for (x=0; x<ARGC; x++)
          print ARGV[x];
print "";
print ARGC;
}

이를 command line에서 이와 같이 수행하면

$ awk -f argv.awk 1234"John Wayne" Weterns n=44 -

그 결과는 다음과 같다

awk
1234
John Wayne
Weterns
n=44
-

6


<TIP>
awk를 사용하다 보면 간혹 FS로 나눈 field로부터 더 작은 subfield를 나누고 싶을 때가 있다.
이런 하나의 field로부터 다른 separator를 가지고 subfield를 나누고 싶을 때 사용할 수 있는 function이 있다.

n = split(string, array, separator)

string:            input string
array:            input string이 나누어져 들어갈 array
separator:      input string을 나눌 separator
n:                 split function을 사용하여 나누어진 subfield의 개수

이렇게 하면 하나의 field 내지 string을 주어진 separator를 통해 나누고 이를 array에 저장하는 것이 가능하다.

'Linux' 카테고리의 다른 글

[Tcl/Tk] Tcl/Tk 문법  (0) 2010.10.20
[awk] awk 사용법#5 - Functions  (0) 2010.05.17
[awk] awk 사용법#3 - Statements  (0) 2010.05.14
[awk] awk 사용법#2 - awk program basic  (0) 2010.05.13
[awk] awk 사용법#1 - awk program의 구조  (0) 2010.05.13
Posted by sunshowers
,