[Linux 셸 스크립트] 텍스트 처리 - 068 ID가 적힌 목록 파일에서 ID를 추출할 때 ID 끝 문자로 정렬하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 텍스트 처리 - 068 ID가 적힌 목록 파일에서 ID를 추출할 때 ID 끝 문자로 정렬하기

by 찬찬이 아빠 2021. 4. 7.
반응형
  1. 사용 명령어

(1) rev

(2)  sort

 

  2. 키워드 & 사용처

(1) 키워드

끝 문자, 정렬, ID 목록

 

(2) 사용처

ID 목록 파일의 끝 문자 순서대로 정렬하여 처리하고 싶을  때 사용합니다.

 

  3. 실행 예제
$ cat id.lst
PPX0_2
AN39_9
UIA5_3
BA06_7
QXD3_0

$ ./revsort.sh id.lst
QXD3_0
PPX0_2
UIA5_3
BA06_7
AN39_9

 

 

  4. 스크립트

#!/bin/sh

 

# 임시 파일 지정

tmpfile="sort.lst"

 

# 대상 ID 파일 확인

if [ ! -f "$1" ]; then                                             

    echo "ID 목록 파일을 지정하세요." >&2             

    exit 1;                                                         

fi

 

# ID 끝 문자 숫자로 목록 정렬

rev "$1" | sort | rev > $tmpfile                         

 

# 정렬한 ID 목록으로 리포트 작성

./report.sh $ tmpfile                                       

 

# 임시 파일 삭제

rm -f $tmpfile

 

 

  5. 해설

이 스크립트는 지정한 ID 목록 파일(id.lst)을 읽어서 ID 끝 문자로 정렬한 목록을 작성하고 순서대로 처리합니다. 제일 먼저 끝 한 자리가 1인 사람을 처리하고 다음엔 2인 사람을 처리하는 식으로 마지막 한 글자값 순서대로 목록을 처리한다고 가정합니다.

 

에서 report.sh는 ID 목록 파일을 대상으로 다양한 처리를 하는 스크립트라고 가정합니다. 이 예제에서는 단순히 파일 내용을 표시하는 스크립트를 사용합니다.


<실행할 스크립트 예(report.sh>

#!/bin/sh

 

# 인수로 지정한 파일 내용 표시

cat "$1"


사용자 관리 시스템 운용 환경에서는 일부 사용자만 선택해서 처리하거나 앙케이트 집계 처리 등 사용자 ID 끝자리 순서대로 처리하고 싶을 때가 가끔 있습니다.

 

이 예제에서는 우선 에서 대상 ID 파일을 확인합니다. test 명령어 -f 옵션으로 파일이 존재하는지 확인해서 부정연산자 !로 파일이 존재하지 않을 때 에러를 표시하고 종료합니다.

 

에서는 ID 목록을 끝 문자로 정렬하기 위해 rev 명령어를 사용합니다. rev 명령어를 그대로 사용하면 다음처럼 파일의 줄마다 문자열을 반전(reverse)해서 표시합니다.

$ cat tmp.txt
abcdefghijklmnopqrstuvwxyz
1234567890

$ rev tmp.txt
zyxwvutsrqponmlkjihgfedcba
0987654321

사용할 일이 적은 명령어이지만 예제처럼 끝 문자로 정렬할 때 편리합니다. 에서 우선 rev 명령어로 문자열을 반전시키고 sort 명령어로 파이프 처리하여 정렬합니다. sort 명령어는 앞부분 글자로 정렬하므로 결국 끝 문자로 정렬하게 되는 겁니다. 문자열이 반전된 상태이므로 파이프 처리로 한 번 더 rev 명령어를 사용해서 원래 문자열로 되돌립니다. 출력 결과를 셸 변수 tmpfile로 지정한 임시 파일에 출력해서 끝 문자로 정렬한 ID 목록 파일을 얻습니다. 이렇게 정렬한 ID 목록 파일이 만들어지면 에서 목록 파일을 받아서 처리하는 스크립트(report.sh)에 넘기고 "끝 문자 순서대로 정렬된 ID순"으로 처리할 수 있습니다.

 

 

<그 외의 끝 문자 정렬>

데이터베이스에 따라서는 다양한 ID 정렬을 사용할 수 있습니다. 여기에서는 셸 스크립트 집계 처리 등에 자주 연계해서 사용하는 MySQL의 예를 들어봅니다. MySQL은 다음처럼 substring 함수로 문자열 일부르르 추출할 수 있습니다.

substring(대상 문자열, 오프셋, 문자 길이)

 

이때 오프셋에 음수를 지정하면 앞에서부터가 아니라 뒤에서부터 위치를 지정할 수 있습니다. 즉 오프셋에 -1, 문자 길이에 1을 지정하면 끝 문자만 추출하게 됩니다. 예를 들어 userinfo 테이블 ID 컬럼을 끝 문자로 정렬하는 select문은 다음과 같습니다.

SELECT id FROM userinfo ORDER BY substring(id, -1, 1);

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글