YouPlot으로 CLI 차트 그리기
YouPlot으로 CLI 차트 그리기
터미널에서 데이터를 그래프로 바로 보고 싶을 때, DuckDB 쿼리 결과를 CLI 그래프 도구에 파이프로 넘기면 한 줄로 시각화할 수 있어요. 이번 페이지에서는 Ruby 기반 CLI 도구인 YouPlot과 연결하는 방법을 살펴볼게요.
출처: 공식문서
YouPlot은 터미널에서 보기 좋은 플롯을 그려 주는 Ruby 기반 CLI 도구입니다. stdin으로 다른 프로그램의 출력을 파이프로 받을 수 있고, 탭(또는 원하는 구분자)으로 구분된 데이터를 받아 막대·꺾은선·히스토그램·산점도 등 다양한 플롯을 쉽게 만들 수 있어요.
DuckDB에서는 TO '/dev/stdout' 명령으로 결과를 콘솔(stdout)에 쓸 수 있습니다. 그리고 WITH (FORMAT csv, HEADER)를 쓰면 콤마로 구분된 값을 함께 출력할 수 있죠.
YouPlot 설치
YouPlot 설치는 공식 YouPlot 저장소에서 안내합니다. Mac을 쓰고 있다면 다음 명령으로 설치할 수 있어요.
brew install youplot
설치가 잘 됐는지 uplot --help를 실행해 확인해 보세요!
DuckDB 쿼리를 stdout으로 파이프
COPY...TO 함수와 CSV 출력 파일을 조합하면, DuckDB가 지원하는 어떤 형식의 데이터든 읽어 YouPlot으로 파이프할 수 있어요. 다음 세 단계로 진행합니다.
-
먼저
input.json에서 모든 데이터를 읽습니다.duckdb -s "SELECT * FROM read_json('input.json')" -
YouPlot에 맞게 데이터를 준비하려면 간단한 집계를 작성합니다.
duckdb -s "SELECT date, sum(purchases) AS total_purchases FROM read_json('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10" -
마지막으로
SELECT를 출력 위치가/dev/stdout인COPY ... TO함수로 감쌉니다. 문법은 다음과 같아요.COPY (⟨query⟩) TO '/dev/stdout' WITH (FORMAT csv, HEADER);아래 전체 DuckDB 명령은 쿼리 결과를 헤더가 있는 CSV 형식으로 출력합니다.
duckdb -s "COPY (SELECT date, sum(purchases) AS total_purchases FROM read_json('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)"
DuckDB를 YouPlot에 연결
이제 데이터를 YouPlot으로 파이프하면 됩니다. 날짜별 구매 횟수가 담긴 input.json 파일이 있다고 가정하고, 위 쿼리를 uplot 명령으로 파이프해 “Top 10 구매 날짜” 막대 플롯을 그려 볼게요.
duckdb -s "COPY (SELECT date, sum(purchases) AS total_purchases FROM read_json('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)" \
| uplot bar -d, -H -t "Top 10 Purchase Dates"
이 명령은 uplot에게 막대 플롯을 그리고(bar), 콤마 구분자(-d,)를 쓰고, 데이터에 헤더가 있으며(-H), 플롯 제목을 붙이라는(-t) 지시를 내려요.
추가 예제: stdin + stdout
혹시 jq로 데이터를 파이프하고 있거나, 어딘가에서 JSON 파일을 내려받는다면 파일명을 /dev/stdin으로 바꿔서 다른 프로세스에서 데이터를 읽게 할 수도 있어요. GitHub에서 curl로 받아 온 데이터를 조합해 보겠습니다.
curl -sL "https://api.github.com/users/dacort/events?per_page=100" \
| duckdb -s "COPY (SELECT type, count(*) AS event_count FROM read_json('/dev/stdin') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)" \
| uplot bar -d, -H -t "GitHub Events for @dacort"
이렇게 하면 파이프 하나로 외부 데이터를 읽고, 집계하고, 그래프까지 그리는 흐름을 만들 수 있어요.
더 알아보기 (Learn more)
COPY ... TO문법 전체는 COPY — TO 문서를 참고하세요.- YouPlot의 모든 플롯 종류와 옵션은 YouPlot 저장소에서 확인할 수 있습니다.