2012년 9월 2일 일요일

배열의 배열

input2.dat
1 1firstElement
1 1secondElement
2 2firstElement
2 2secondElement
2 2thirdElement
3 3firstElement

test2.awk
#!/usr/bin/bash
#
BEGIN {
    arrayIndex = 1
    i = 1
}
{
    if ( $1 == arrayIndex ) {
        myArray[arrayIndex][i] = $2
    }
    else {
        arrayIndex += 1
        i = 1
        myArray[arrayIndex][i] = $2
    }
    i += 1
}
END {
    for ( i in myArray ) {
        for ( j in myArray[i] ) {
            print "myArray["i"]["j"]:" myArray[i][j]
        }
    }
}

아... 허접한 코드...

getline

현재의 입력파일 또는 지시된 파일을 one record 만큼만 읽어들임.
  • 파일이 없으면: -1
  • 읽어들일 레코드가 없으면: 0
  • 읽기에 성공하면: 1
을 반환한다.

표준입력파일 외의 파일을 읽어들이고 싶은 경우에는
while ( (getline < "fileName") > 0 ) { what_you_want_to }
로 처리해 준다.

주의점:
  • 위의 fileName으로 read-in하는 것은 한 파일당 한번만 read-in한다. 즉, 표준입력파일의 레코드를 읽어들일때 마다 처리되지 않는다. -> 보조 DATA 파일을 read-in하는데 이용.
  • getline하는 동안 FILENAME, FNR, NR은 변하지 않는다. 즉, getline이 execution하기 직전의 FILENAME, FNR, NR 값이 유지된다.


예시:

input.dat
firstLine
secondLine
thirdLine
foruthLine
fifthLine

auxData.dat
auxFirstLine
auxSecondLine
auxThirdLine

test.awk
#!/usr/bin/gawk
#

BEGIN {
}

{
    print "FILENAME:" FILENAME "/ FNR:" FNR "/ NR:" NR
    print "$0 is :" $0
    print "----------------------------------------"

    while ( (getline < "auxData.dat") > 0 ) {
    print "FILENAME:" FILENAME "/ FNR:" FNR "/ NR:" NR
    print "$0 is :" $0
    print "==========================================="
    }
}

END {
}

OutPut
FILENAME:input.dat/ FNR:1/ NR:1
$0 is :firstLine
----------------------------------------
FILENAME:input.dat/ FNR:1/ NR:1
$0 is :auxFirstLine
===========================================
FILENAME:input.dat/ FNR:1/ NR:1
$0 is :auxSecondLine
===========================================
FILENAME:input.dat/ FNR:1/ NR:1
$0 is :auxThirdLine
===========================================
FILENAME:input.dat/ FNR:2/ NR:2
$0 is :secondLine
----------------------------------------
FILENAME:input.dat/ FNR:3/ NR:3
$0 is :thirdLine
----------------------------------------
FILENAME:input.dat/ FNR:4/ NR:4
$0 is :foruthLine
----------------------------------------
FILENAME:input.dat/ FNR:5/ NR:5
$0 is :fifthLine
----------------------------------------