REFERENCE‎ > ‎

양·음력 대조표

양음력 대조표는 여러 계산법이 나왔으나 결과적으로 모두 오차가 있는 것으로 알고 있다. 그렇다면 한국천문연구원에서 제공하는 대조표가 가장 정확한 한국 음력일 것이므로 따로 계산하지 않고 DB화된 대조표를 통해 처리하는 것이 가장 정확할 것이라고 판단된다. 따라서 천문연구원에서 제공하는 대조표 페이지를 통해 자료를 수집하고 정리하기로 했다. 

다음 명령을 통해 우선 천문연구원에서 년월별 양음력 대조표를 받았다. 1391년 2월부터 2050년 12월까지라고 되어 있어서 1391년 1월일 경우는 제외했다. 그리고 트래픽을 일시에 집중할 경우 차단될까 싶어서 sleep으로 1초씩 쉬도록 했다.
#!/bin/bash
URL='http://www.kasi.re.kr/Knowledge/solar2lunar/convert_monthly.php'
for y in {1391..2050}; do
  for m in {1..12}; do
    if [ "x$y" = "x1391" ] && [ "x$m" = "x1" ]; then continue; fi
    wget --post-data "sol_year=$y&sol_month=$m" -O result-$y-$m.html $URL
    sleep 1
  done
done

각 HTML 파일을 w3m -dump 명령으로 텍스트로 바꿔보면 다음과 같이 나온다.
2006-08-22 (화) 2006-07-29 병술(丙戌)년 병신(丙申)월 계미(癸未)일 ●
2006-08-23 (수) 2006-07-30 병술(丙戌)년 병신(丙申)월 갑신(甲申)일 ●
^1 2006-07-25 (화) 2006-07-01 (윤) 병술(丙戌)년 병신(丙申)월 을유(乙酉)일 ●
^2 2006-08-24 (목)
^1 2006-07-26 (수) 2006-07-02 (윤) 병술(丙戌)년 병신(丙申)월 병술(丙戌)일 ●
^2 2006-08-25 (금)

앞에 숫자가 붙은 것은 윤달로, http://www.kasi.re.kr/Knowledge/convert_monthly.aspx 의 설명에 따르면 ^1은 음력평달에 해당하는 양력, ^2는 음력윤달에 해당하는 양력이라고 한다. 윤달이 아닐 때는 한 줄에 하나씩이지만 윤달일 때는 두 줄에 걸쳐 다른 형식으로 나오기 때문에 어떻게 처리할지 생각을 해봐야 한다. 테이블의 너비를 늘이면 한 줄에 나오지 않을까 했는데 소스를 보면 명시적으로 br이 들어가 있다. grep br * | wc -l으로 확인한 바로는 14147개가 들어가 있고, perl -pi -e 's/<br>//g' result*.html 명령으로 모두 제거했다. 하지만 이렇게 하고 보니 (테이블 자체에 width=600으로 정해져 있어서) 전체적으로 줄이 넘어간다. 다시 perl -pi -e 's/width=600/width=800/' result*.html 명령으로 너비를 넓혀서 줄이 넘어가지 않도록 했다.

원래 있는 정보 중에서 텍스트로 바꾸면서 달의 모양 그림 (맨 오른쪽의 점)이 소실되는데 코드를 보면
<img src=./images/08.gif width=20 height=20 alt=''> 
이라고 되어 있어서 alt 안에 뭔가 넣어주면 원래 정보를 살릴 수 있을 것 같다. 01이 그믐, 02에서 오른쪽부터 생기다가, 15가 보름이고, 왼쪽에 조금 남은 30까지 있다. perl -pi -e "s/\/(..)\.gif(.+)''>/\/\\1\.gif\\2'\\1'>/" result*.html 명령으로 처리하였다.

그리고 테이블의 각 열 단위로 구분하기가 여의치 않아서 perl -pi -e 's/border=0/border=1/' result*.html 로 테이블 테두리가 생기도록 했다. 뒤에 음력평달과 음력윤달을 두 줄로 나눌 때 양력 날짜 외의 나머지 항목을 복제할 때 편하게 처리할 수 있게 되었다. 단 결과가 일반적인 파이프 문자가 아니라 그래픽 문자라서 나중에 파이프 문자로 변경해 awk에서 바로 인식되도록 했다.

결과물을 w3m -dump result*.html | grep -- [0-9]-[0-9] > dump-raw.txt 명령을 통해 날짜를 포함한 줄만 (즉 설명 부분을 빼고) 한 파일로 모았다. 모두 240713줄.

다음은 awk로, ^로 시작하는지 보아서 윤달인지 아닌지 보고, 윤달이면 두 부분으로 쪼개서 두 개를 만들고 아니면 넘어가는 식으로 일단 전체적으로 동일한 형태가 되게 전처리를 했다. (border=0일 때의 결과로) sort를 해서 보니 ^2만 있는 줄이 있고 ^1과 ^2가 같이 있는 줄이 있다.
^2 2047-07-22 (월) 2047-05-30 (윤) 정묘(丁卯)년 병오(丙午)월 정해(丁亥)일 30
^2 2050-05-20 (금) 2050-03-30 (윤) 경오(庚午)년 경진(庚辰)월 경자(庚子)일 30
^1 1392-12-14 (토)^2 1393-01-13 (월) 1392-12-01 (윤) 임신(壬申)년 계축(癸丑)월 정축(丁丑)일 01
^1 2050-04-19 (화)^2 2050-05-18 (수) 2050-03-28 (윤) 경오(庚午)년 경진(庚辰)월 무술(戊戌)일 28
^1 2050-04-20 (수)^2 2050-05-19 (목) 2050-03-29 (윤) 경오(庚午)년 경진(庚辰)월 기해(己亥)일 29
1391-02-05 (일) 1391-01-01 신미(辛未)년 경인(庚寅)월 기축(己丑)일 01
1391-02-06 (월) 1391-01-02 신미(辛未)년 경인(庚寅)월 경인(庚寅)일 02
식이다.

이를 다음과 같은 awk 코드를 통해 중복되는 줄을 두 줄로 분리했다.
BEGIN {
  FS="|"
}

{
  if (split($2, pair, /_/) > 1) {
    print $1 FS pair[1] FS $3 FS $4 FS $5 FS $6 "o"
    print $1 FS pair[2] FS $3 FS $4 FS $5 FS $6 "o"
  } else {
    print $0 "x"
  }
}

분리된 결과물은 모두 247763줄. 다음과 같은 형태다. 줄 끝의 xo는 처리 확인을 위해 임의로 붙였다.
| 1393-01-12 (일) | 1392-12-30 | 임신(壬申)년 계축(癸丑)월 병자(丙子)일 | 30 |x
| ^1 1392-12-14 (토) | 1392-12-01 (윤) | 임신(壬申)년 계축(癸丑)월 정축(丁丑)일 | 01 |o
| ^2 1393-01-13 (월) | 1392-12-01 (윤) | 임신(壬申)년 계축(癸丑)월 정축(丁丑)일 | 01 |o
| ^1 1392-12-15 (일) | 1392-12-02 (윤) | 임신(壬申)년 계축(癸丑)월 무인(戊寅)일 | 02 |o
| ^2 1393-01-14 (화) | 1392-12-02 (윤) | 임신(壬申)년 계축(癸丑)월 무인(戊寅)일 | 02 |o

그리고 vim 에서 :%s/(\([일월화수목금토]\)/|(\1/ 명령으로 요일 앞에 구분자를 넣어 날짜와 요일이 아예 분리되도록 했다. 그리고 윤달이 아닌 달과 윤달의 음력 평달·윤달을 분리했다. 음력 필드의 윤달 괄호는 앞의 1·2로 구분되기 때문에 불필요해서 제거했다. 결과는 다음과 같다.
| 0 | 1393-01-11 | (토) | 1392-12-29 | 임신(壬申)년 | 계축(癸丑)월 | 을해(乙亥)일 | 29 |
| 0 | 1393-01-12 | (일) | 1392-12-30 | 임신(壬申)년 | 계축(癸丑)월 | 병자(丙子)일 | 30 |
| 1 | 1392-12-14 | (토) | 1392-12-01 | 임신(壬申)년 | 계축(癸丑)월 | 정축(丁丑)일 | 01 |
| 2 | 1393-01-13 | (월) | 1392-12-01 | 임신(壬申)년 | 계축(癸丑)월 | 정축(丁丑)일 | 01 |

필드를 순서대로 다시 정리하면
  1. [012] 윤달인지 아닌지, 윤달이면 평달인지 윤달인지
  2. 양력 날짜
  3. 양력 요일
  4. 음력 날짜
  5. 음력 년월일 갑자
  6. 01~30 그믐~보름~그믐직전 달 모양


이상의 과정은 2009년 6월 9일 새벽에 진행하였으며, 결과물은 아래에 첨부된 엑셀 파일로 만들었다. (이후에 세기별로 시트를 분리하기도 했는데 시공간의 틈새로 사라져 버린 것 같다)
Ĉ
Jeong-Hee Kang,
2010. 7. 3. 오후 5:16
Comments