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);
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 텍스트 처리 - 070 파일 앞머리의 셔뱅(shebang, #!/bin/sh 등)을 추출해서 스크립트에 따라 확장자 붙이기 (0) | 2021.04.07 |
---|---|
[Linux 셸 스크립트] 텍스트 처리 - 069 텍스트 파일에서 구분자를 지정해서 컬럼 추출하기 (0) | 2021.04.07 |
[Linux 셸 스크립트] 네트워크 - 067 로컬 셸 스크립트 파일을 원격 호스트에서 그대로 실행하기 (0) | 2021.04.07 |
[Linux 셸 스크립트] 네트워크 - 066 IP 주소에 따른 처리 분기를 case문으로 작성하기 (0) | 2021.04.07 |
[Linux 셸 스크립트] 네트워크 - 065 지정한 크기의 파일을 만들어서 전송 속도를 측정하기 (0) | 2021.04.07 |
댓글