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
----------------------------------------

2012년 6월 24일 일요일

rand() 성능 향상 방법

rand() 함수는 의사난수 생성기이다.
srand()로 seeding후 rand()하면 된다지만,
연속해서 rand()를 호출하는 경우 거의 동일한 수가 나온다.
이는 srand()가 time()을 가지고 seeding하기 때문.

넷상 검색결과로는,
shell에서 PID를 취득하는 방법과,
jot 명령어를 사용하는 방법이 있다.
(각각을 -v 옵션 변수로 gawk로 넘겨준다.)

그러나,
srand() ---> rand() 호출시 거의 같은 값이 나오는 이유는
rand() 호출시 마다 srand()를 호출하기 때문이다.

해결책은 BEGIN에서 srand()를 한번만 호출 한 뒤에 rand()를 호출하면,
충분히 random한 수열을 얻을 수 있다.


2012년 5월 31일 목요일

gawk for XP SP3 error

XP SP3에서 buffer어쩌고가 print되는 error가 있음.
debug용 같지만, SP3에서만 나타나는 error라고 함.

2012년 3월 23일 금요일

sed, awk란?

유닉스의 라인에디터인 ed에서 파생된 유틸입니다.
sed는 ed의 에디팅 기능을 전수받았으며,
awk는 ed의 에디팅 기능을 버리고 프로그래밍언어의 기능들을 구현하였습니다.

크게 보아,
입력 텍스트파일을 수정/교정하는데 sed를 사용하고,
수정된 파일을 정열하는데 awk를 사용한다고 생각하면 무난할 것 같습니다.

from "sed & awk Programming" by D. Dougherty, A. Robbins.
홈