텍스트처리_01 ID가 적힌 목록 파일에서 ID를 추출할 때 ID 끝 문자로 정렬하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: 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);