- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: rev, sort
키워드: 끝 문자, 정렬, ID 목록
사용처: ID 목록 파일의 끝 문자 순서대로 정렬하여 처리하고 싶을 때
실행예제
$ cat id.lst #-------- 순서가 엉망인 ID 목록 파일
PPX0_2
AN39_9
UIA5_3
BA06_7
QXD3_0
$ ./revsort.sh id.lst #-------- 끝 문자(숫자)로 정렬
QXD3_0
PPX0_2
UIA5_3
BA06_7
AN39_9
스크립트
#!/bin/sh
# 임시 파일 지정
tmpfile="sort.lst"
# 대상 ID 파일 확인
if [ ! -f "$1"]; then #------------------------- 1 (if문전체)
echo "ID 목록 파일을 지정하세요." >&2
exit 1;
fi
# ID 끝 문자 숫자로 목록 정렬
rev "$1" | sort | rev > $tmpfile #-------------- 2
# 정렬한 ID 목록으로 리포트 작성
./report.sh $tmpfile #-------------------------- 3
# 임시 파일 삭제
rm -f $tmpfile
해설
이 스크립트는 지정한 ID 목록 파일(id.lst)을 읽어서 ID 끝 문자로 정렬한 목록을 작성하고 순서대로 처리합니다. 제일 먼저 끝 한 자리가 1인 사람을 처리하고 다음엔 2인 사람을 처리하는 식으로 마지막 한 글자값 순서대로 목록을 처리한다고 가정합니다.
3
에서 report.sh는 ID 목록 파일을 대상으로 다양한 처리를 하는 스크립트라고 가정합니다. 이 예제에서는 단순히 파일 내용을 표시하는 스크립트를 사용합니다.
-
파일1
실행할 스크립트 예(report.sh)#!/bin/sh # 인수로 지정한 파일 내용 표시 cat "$1"
사용자 관리 시스템 운용 환경에서는 일부 사용자만 선택해서 처리하거나 앙케이트 집계 처리 등 사용자 ID 끝자리 순서대로 처리하고 싶을 때가 가끔 있습니다.
이 예제에서는 우선 1
에서 대상 ID 파일을 확인합니다. test 명령어 -f 옵션으로 파일이 존재하는지 확인해서 부정연산자 !로 파일이 존재하지 않을 때 에러를 표시하고 종료합니다.
**
2
에서는 ID 목록을 끝 문자로 정렬하기 위해 rev 명령어를 사용합니다. rev 명령어를 그대로 사용하면 다음처럼 파일의 줄마다 문자열을 반전(reverse)해서 표시합니다.
$ cat tmp.txt
abcdefghijklmnopqrstuvwxyz
1234567890
$ rev tmp.txt
zyxwvutsrqponmlkjihgfedcba
0987654321
사용할 일이 적은 명령어이지만 예제처럼 끝 문자로 정렬할 때 편리합니다. 2
에서 우선 rev 명령어로 문자열을 반전시키고 sort 명령어로 파이프 처리하여 정렬합니다. sort 명령어는 앞부분 글자로 정렬하므로 결국 끝 문자로 정렬하게 되는 겁니다. 문자열이 반전된 상태이므로 파이프 처리로 한 번 더 rev 명령어를 사용해서 원래 문자열로 되돌립니다. 출력 결과를 셸 변수 tmpfile로 지정한 임시 파일에 출력해서 끝 문자로 정렬한 ID 목록 파일을 얻습니다. 이렇게 정렬한 ID 목록 파일이 만들어지면 목록 파일을 받아서 처리하는 스크립트(report.sh)에 넘기고 “끝 문자 순서대로 정렬된 ID순”으로 처리할 수 있습니다.3
그 외의 끝 문자정렬
데이터베이스에 따라서는 다양한 ID 정렬을 사용할 수 있습니다. 여기에서는 셸 스크립트 집계 처리 등에 자주 연계해서 사용하는 MySQL의 예를 들어봅시다. MySQL은 다음처럼 substring 함수로 문자열 일부를 추출할 수 있습니다.
substring(대상 문자열, 오프셋, 문자 길이)
이때 오프셋에 음수를 지정하면 앞에서부터가 아니라 뒤에서부터 위치를 지정할 수 있습니다. 즉 오프셋에 -1, 문자 길이에 1을 지정하면 끝 문자만 추출하게 됩니다. 예를 들어 userinfo 테이블 ID 컬럼을 끝 문자로 정렬하는 select문은 다음과 같습니다.
SELECT id FROM userinfo ORDER BY substring(id, -1, 1);