소개
awk는 필터링과 텍스트 추출뿐 아니라 산술 연산도 수행할 수 있는 강력한 텍스트 처리 언어입니다. 열의 합계를 계산하고, 평균을 구하고, 발생 횟수를 셀 수 있으므로 명령줄에서 바로 보고서와 통계를 만들 수 있습니다.
awk가 수십 년 동안 유용하게 사용된 이유 중 하나도 여기에 있습니다. 운영 작업에서는 텍스트 파일을 대상으로 간단한 보고서를 만들어야 하는 경우가 많으며, awk를 사용하면 전체 스프레드시트나 별도의 프로그래밍 환경 없이도 이러한 작업을 수행할 수 있습니다.
이 실습에서는 awk를 사용해 다음 작업을 수행하는 방법을 배웁니다.
- 변수 초기화:
BEGIN블록을 사용해 시작 값을 설정합니다. - 계산 수행: 각 행의 값을 더해 누적 합계를 만듭니다.
- 최종 결과 출력:
END블록을 사용해 합계와 요약을 출력합니다. - 조건에 따른 개수 세기: 특정 조건을 충족하는 행만 셉니다.
변수 초기화
계산을 시작하기 전에 변수를 초기화해야 하는 경우가 많습니다. awk에서는 BEGIN 블록이 모든 행을 처리하기 전에 한 번만 실행되므로 변수를 초기화하기에 적합합니다.
따라서 BEGIN은 카운터, 합계 또는 제목을 초기화하는 등의 준비 작업을 수행하는 곳으로 자연스럽게 사용할 수 있습니다. 다른 프로그래밍 언어의 초기화 코드와 같은 역할을 합니다.
먼저 데이터 파일 data.txt의 내용을 확인합니다.
cat data.txt
이 파일에는 두 개의 열이 있습니다. 첫 번째 열은 Item($1), 두 번째 열은 Quantity($2) 입니다.
total이라는 변수를 만들고 값을 0으로 설정합니다.
다음 명령을 실행합니다.
awk 'BEGIN { total=0; print "Calculator ready. Total is initialized to:", total }' data.txt
작동 방식:
awk가BEGIN블록을 실행합니다.- 변수
total을 0 으로 설정합니다. - 메시지를 출력합니다.
BEGIN블록 뒤에 실행할 기본 코드 블록이 없으므로 여기서 멈춥니다. 단, 기술적으로는 파일을 처리할 준비가 된 상태입니다.
열의 합계 계산
이제 파일을 처리합니다. 수량을 나타내는 두 번째 열 ($2) 의 값을 모두 더합니다.
awk가 각 행을 읽을 때마다 $2의 값을 변수 total에 더합니다.
더하기 대입 연산의 문법은 total += $2입니다. 이는 total = total + $2를 줄여 쓴 표현입니다.
이처럼 awk는 단순히 열을 출력하는 도구 이상의 기능을 제공합니다. 파일을 처리하면서 상태를 유지하므로 원본 행을 출력하는 데 그치지 않고 합계와 요약을 점진적으로 계산할 수 있습니다.
각 행을 처리하면서 계산되는 과정을 확인하려면 다음 명령을 실행합니다.
awk 'BEGIN { total=0 } { total += $2; print "Added", $1, "("$2") - Current Total:", total }' data.txt
로직:
- BEGIN:
total을 0 으로 초기화합니다. - 기본 블록: 각 행의 수량 (
$2) 을total에 더하고 상태를 출력합니다.
각 항목이 처리될 때마다 합계가 증가하는 것을 확인할 수 있습니다.
최종 결과 출력
일반적으로는 중간 계산 과정이 아니라 최종 합계만 필요합니다.
이때 END 블록을 사용합니다. END 블록은 모든 행을 처리한 후 한 번만 실행됩니다.
따라서 awk 스크립트는 보통 세 단계로 구성됩니다. BEGIN에서는 준비 작업을 수행하고, 기본 블록에서는 각 레코드에 대한 작업을 수행하며, END에서는 최종 보고서를 출력합니다. 이러한 구조를 이해하는 것은 awk를 효과적으로 사용하는 데 중요한 기본 개념입니다.
다음과 같이 정리한 명령을 실행합니다.
awk 'BEGIN { total=0 } { total += $2 } END { print "Final Total Quantity:", total }' data.txt
구성:
BEGIN:total을 0 으로 설정합니다.{ ... }: 파일을 읽으면서$2를total에 더합니다. 중간 결과는 출력하지 않습니다.END: 파일의 끝에 도달하면total의 최종 값을 출력합니다.
출력 결과는 Final Total Quantity: 22여야 합니다.
조건에 따른 개수 세기
모든 값을 단순히 더하는 대신 조건에 따라 발생 횟수를 세어야 하는 경우가 많습니다.
예를 들어, "재고 수량이 4 보다 많은 항목은 몇 개일까요?"를 확인할 수 있습니다.
- 카운터를 초기화합니다 (
count = 0). - 각 행을 확인합니다:
if ($2 > 4). - 조건이 참이면 카운터를 증가시킵니다:
count++. END블록에서 결과를 출력합니다.
이 예제에서는 awk가 파일을 한 번 처리하면서 구문 분석, 조건문, 산술 연산을 함께 수행합니다. 따라서 많은 운영 보고서에서 다른 언어로 별도의 프로그램을 작성하지 않아도 됩니다.
개수를 세는 명령을 실행합니다.
awk 'BEGIN { count=0 } { if ($2 > 4) count++ } END { print "Items with quantity > 4:", count }' data.txt
결과는 2 여야 합니다 (Apple 과 Cherry).
로직을 결합할 수도 있습니다. 다음 명령은 4 보다 큰 값만 더합니다.
awk 'BEGIN { sum=0 } { if ($2 > 4) sum += $2 } END { print "Sum of quantities > 4:", sum }' data.txt
합계는 13 입니다 (5 + 8).
요약
이 실습에서는 awk를 사용해 계산과 통계를 수행하는 방법을 배웠습니다.
- BEGIN 블록: 파일 처리를 시작하기 전에 변수를 초기화합니다.
- 산술 연산 (
+=): 행별로 열을 더하는 등의 계산을 수행합니다. - 조건문 (
if): 특정 조건을 충족할 때만 로직을 실행합니다 (예: 개수 세기). - END 블록: 파일 처리가 끝난 후 최종 결과를 출력합니다.
이러한 기능을 사용하면 터미널에서 텍스트 파일을 바로 처리해 정교한 데이터 요약과 지표를 만들 수 있습니다.



