1. 사용 명령어 |
(1) read
(2) cut
(3) test
2. 키워드 & 사용처 |
(1) 키워드
숫자값, 문자열, 0 채우기
(2) 사용처
"00001" 처럼 0으로 채운 문자열을 그대로 숫자로 다루고 싶을 때 사용합니다.
3. 실행 예제 |
$ cat data.csv
00001,Busan
2,Kim
3,Park
00004,Seo
$ ./zero-string.sh
Busan <- ID 번호가 1인 값을 출력
4. 스크립트 |
#!/bin/sh
# 추출 조건 등 정의
match_id=1 # 추출할 ID ①
csvfile="data.csv" # CSV 파일 지정 ①
# CSV 파일이 없으면 종료
if [ ! -f "$csvfile" ]; then ②
echo "CSV 파일이 존재하지 않습니다: $csvfile" >&2 ②
exit 1 ②
fi
# CSV 파일 읽기
while read line ③
do
# 각 컬럼을 cut으로 추출
id=$(echo $line | cut -f 1 -d ',') ④
name=$(echo $line | cut -f 2 -d ',') ④
# ID 컬럼이 셸 변수 match_id로 지정한 ID와 일치하면 이름 표시
if [ "$id" eq "$match_id" ]; then ⑤
echo "$name" ⑤
fi
done < "$csvfile"
5. 해설 |
이 스크립트는 CSV 파일에서 ID 번호가 1인 컬럼을 추출합니다. 이때 '숫자가 1'이라는 표현에는 1 외에도 00001과 같이 앞부분에 0이 있는 형식도 포함합니다.
예제에서는 다음과 같은 CSV 파일을 다룹니다.
00001,Busan
2,Kim
3,Park
00004,Seo
첫 번째 컬럼에 ID 번호, 두 번째 이름이 있습니다. CSV 파일에 0으로 시작하는 값과 그렇지 않은 값이 섞여 있습니다. 이렇듯 숫자값 앞부분에 0이 있는 숫자 문자열을 보통 숫자값으로 다루는 일이 종종 발생합니다.
예를 들어 sed 명령어 등으로 앞부분 0을 제거하는 방법이 있습니다.
str="00001"
str=$(echo "$str" | sed "s/^0*//"
하지만 셸 스크립트라면 이런 처리가 필요 없습니다. test 명령에서는 같은 값인지 판정하는 -eq 연산자나 expr 명령어 등 숫자값을 다루는 명령어는 0으로 채운 숫자 문자열을 그대로 순수한 숫자값으로 다룰 수 있기 때문입니다.
예를 들어 아래처럼 expr 명령어는 0으로 채워도 문제없이 동작합니다.
$ expr "00001" + 1
2
①에서 추출할 ID 번호와 대상 CSV 파일을 정의합니다. ②에서는 대상 CSV 파일 존재를 확인합니다. -f는 대상이 일반 파일인지 확인하는 연사자입니다. 파일이 존재하지 않거나 디렉터리이거나 하면 에러를 표시하고 종료합니다.
③에서는 while문의 입력 리다이렉트로 CSV 파일을 한 줄씩 셸 변수 line에 읽어들입니다. ④는 cut 명령어로 추출한 컬럼값을셸 변수 id와 name에 각각 대입합니다.
⑤에서 ID 번호 컬럼값이 셸 변수 match_id로 정의한 추출해야 할 ID 번호와 일치하는지 판별합니다. 여기서 단순히 추출할 첫 번째 컬럼(셸 변수 id)을 test 명령어 -eq 연산자로 확인합니다. test 명령어 -eq 연산자는 다음처럼 앞부분 0은 신경 쓰지 않아도 됩니다.
# 숫자와 비교하면 앞부분 0은 신경 쓰지 않아도 됨
[ "00001" -eq 1 ] -> true
[ "1" -eq 1 ] -> true
# 문자열로 비교하면 거짓이 됨
[ "00001" = "1" ] -> false
하지만 test 명령어를 =로 비교하면 문자열로 비교하게 되므로 00001과 1은 서로 다른 값이 됩니다. 숫자로 비교하려면 -eq 연산자를 사용해야 합니다.
⑤는 이렇게 비교해서 참이면 추출해야 할 ID 번호의 name 값을 echo 명령어로 출력합니다. 셸 스크립트에서 숫자 문자열을 간단히 다룰 수 있으므로 CSV 파일을 사용할 때 알아두면 편리합니다.
<주의사항>
이 스크립트는 값에 ,(쉼표)가 있는 CSV 파일에 대응하지 않습니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 제어 구문 - 103 웹 서버에서 파일을 내려받아서 MD5 해시값 계산하기 (0) | 2021.04.21 |
---|---|
[Linux 셸 스크립트] 제어 구문 - 102 스크립트를 수정해서 if문 안이 비더라도 에러가 발생하지 않게 하기 (0) | 2021.04.21 |
[Linux 셸 스크립트] 제어 구문 - 100 강제 종료될 때까지 파일 내려받기를 반복해 통신 확인하기 (0) | 2021.04.20 |
[Linux 셸 스크립트] 제어 구문 - 099 연속된 파일명을 가진 URL을 자동 생성해서 순서대로 내려받기 (0) | 2021.04.20 |
[Linux 셸 스크립트] 제어 구문 - 098 변수가 포함된 IP 주소 목록 파일을 읽어서 ping 명령어로 확인하기 (0) | 2021.04.19 |
댓글