Linux Bash shell script

Bash Shell Script - CSV 파일 처리하기

임베디드 친구 2025. 2. 12. 09:20
728x90
반응형

CSV(Comma-Separated Values) 파일은 스프레드시트나 데이터베이스와 같은 구조화된 데이터를 저장하는 데 자주 사용되는 형식입니다. 이번 블로그 포스팅에서는 Linux 환경에서 Bash 스크립트를 사용하여 CSV 파일을 처리하는 방법을 알아보겠습니다. CSV 파일을 읽고, 조작하고, 처리하는 효율적인 방법들을 배울 수 있습니다.

사전 준비

예제를 시작하기 전에 다음을 준비하세요:

  • Bash 스크립트에 대한 기본적인 이해.
  • awk, sed, grep과 같은 기본 도구가 설치된 Linux 환경.
  • 실습용 CSV 파일.

예제로 사용할 CSV 파일은 employees.csv이며, 내용은 다음과 같습니다:

id,name,age,department,salary
1,John Doe,29,Engineering,75000
2,Jane Smith,34,Marketing,68000
3,Bob Johnson,25,Sales,50000
4,Alice Davis,30,Engineering,80000
5,Charlie Brown,28,Marketing,72000

CSV 파일 읽기

CSV 파일을 처리하려면 먼저 파일 내용을 읽어야 합니다. IFS(Internal Field Separator) 변수와 while 루프를 사용하여 각 줄을 파싱할 수 있습니다.

#!/bin/bash

# 처리할 파일
FILE="employees.csv"

# 파일을 한 줄씩 읽기
while IFS=',' read -r id name age department salary; do
  echo "ID: $id, 이름: $name, 나이: $age, 부서: $department, 연봉: $salary"
done < <(tail -n +2 "$FILE")

설명

  • IFS=',': 필드 구분자를 콤마로 설정합니다.
  • tail -n +2: CSV 파일의 헤더 행을 건너뜁니다.
  • read -r: 각 줄을 읽어 필드 구분자에 따라 변수를 할당합니다.

행 필터링

특정 조건에 따라 행을 필터링하려면 awk를 사용할 수 있습니다.

예제: Engineering 부서의 직원 필터링

#!/bin/bash

awk -F',' '$4 == "Engineering" { print $0 }' employees.csv

설명

  • -F',': 필드 구분자를 콤마로 설정합니다.
  • $4 == "Engineering": 네 번째 필드(부서)가 "Engineering"인지 확인합니다.

값 합산

모든 직원의 총 연봉을 계산하려면 awk를 사용할 수 있습니다:

#!/bin/bash

awk -F',' 'NR > 1 { sum += $5 } END { print "총 연봉:", sum }' employees.csv

설명

  • NR > 1: 헤더 행을 건너뜁니다.
  • sum += $5: 다섯 번째 필드(연봉)를 합산합니다.
  • END: 모든 행을 처리한 후 합계를 출력합니다.

새로운 열 추가

새로운 열을 추가하여 직원이 특정 연봉 임계값 이상인지 여부를 표시하려면 awk를 사용할 수 있습니다.

#!/bin/bash

THRESHOLD=70000

awk -F',' -v threshold="$THRESHOLD" 'BEGIN { OFS="," } \
NR == 1 { print $0, "임계값_초과" } \
NR > 1 { print $0, ($5 > threshold ? "예" : "아니오") }' employees.csv

설명

  • -v threshold="$THRESHOLD": 변수를 awk에 전달합니다.
  • OFS=",": 출력 필드 구분자를 콤마로 설정합니다.
  • ($5 > threshold ? "예" : "아니오"): 연봉 임계값 초과 여부를 "예" 또는 "아니오"로 추가합니다.

열 삭제

특정 열을 삭제하려면 awk를 사용할 수 있습니다.

예제: 나이 열 삭제

#!/bin/bash

awk -F',' 'BEGIN { OFS="," } \
{ $3=""; print $1, $2, $4, $5 }' employees.csv

설명

  • $3="": 세 번째 필드(나이)를 삭제합니다.
  • print $1, $2, $4, $5: 나머지 필드를 출력합니다.

새로운 CSV 파일 생성

처리된 데이터를 새로운 CSV 파일로 저장하려면 출력 리디렉션을 사용할 수 있습니다.

예제: 필터링된 데이터 저장

#!/bin/bash

awk -F',' '$4 == "Marketing" { print $0 }' employees.csv > marketing_employees.csv

대용량 파일 처리

대용량 CSV 파일의 경우, csvkit과 같은 도구를 사용하거나 파일을 청크로 나누는 방법을 고려할 수 있습니다.

예제: 큰 파일을 작은 파일로 분할

#!/bin/bash

split -l 1000 large_file.csv chunk_

설명

  • -l 1000: 파일을 1000줄 단위로 분할합니다.
  • chunk_: 출력 파일의 접두사입니다.

결론

Bash를 사용한 CSV 파일 처리는 강력하고 유연합니다. awk, sed, grep과 같은 도구를 조합하면 다양한 데이터 처리 작업을 수행할 수 있습니다.

여기 제공된 예제를 직접 실행해보고, 필요에 따라 응용해 보세요.

반응형