2012년 10월 23일 화요일
2012년 9월 30일 일요일
2012년 9월 2일 일요일
배열의 배열
input2.dat
test2.awk
아... 허접한 코드...
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 만큼만 읽어들임.
표준입력파일 외의 파일을 읽어들이고 싶은 경우에는
주의점:
예시:
input.dat
auxData.dat
test.awk
OutPut
- 파일이 없으면: -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한 수열을 얻을 수 있다.
srand()로 seeding후 rand()하면 된다지만,
연속해서 rand()를 호출하는 경우 거의 동일한 수가 나온다.
이는 srand()가 time()을 가지고 seeding하기 때문.
넷상 검색결과로는,
shell에서 PID를 취득하는 방법과,
jot 명령어를 사용하는 방법이 있다.
(각각을 -v 옵션 변수로 gawk로 넘겨준다.)
그러나,
srand() ---> rand() 호출시 거의 같은 값이 나오는 이유는
rand() 호출시 마다 srand()를 호출하기 때문이다.
해결책은 BEGIN에서 srand()를 한번만 호출 한 뒤에 rand()를 호출하면,
충분히 random한 수열을 얻을 수 있다.
2012년 5월 31일 목요일
2012년 3월 23일 금요일
sed, awk란?
유닉스의 라인에디터인 ed에서 파생된 유틸입니다.
sed는 ed의 에디팅 기능을 전수받았으며,
awk는 ed의 에디팅 기능을 버리고 프로그래밍언어의 기능들을 구현하였습니다.
크게 보아,
입력 텍스트파일을 수정/교정하는데 sed를 사용하고,
수정된 파일을 정열하는데 awk를 사용한다고 생각하면 무난할 것 같습니다.
from "sed & awk Programming" by D. Dougherty, A. Robbins.
sed는 ed의 에디팅 기능을 전수받았으며,
awk는 ed의 에디팅 기능을 버리고 프로그래밍언어의 기능들을 구현하였습니다.
크게 보아,
입력 텍스트파일을 수정/교정하는데 sed를 사용하고,
수정된 파일을 정열하는데 awk를 사용한다고 생각하면 무난할 것 같습니다.
from "sed & awk Programming" by D. Dougherty, A. Robbins.
피드 구독하기:
글 (Atom)

