[Command-line] sort 명령어를 이용한 텍스트 정렬

2021. 1. 12. 17:49Linux/Command-line

반응형
  1. sort
  2. sort 사용 예제
    1. character 정렬
      1. 기본
      2. 중복 필드 제거
    2. numeric 정렬
      1. general-numeric sort
      2. numeric sort
      3. human-numeric sort
    3. Month 정렬
  3. key 옵션 심화
    1. end field number 생략
    2. C(character position)

1. sort

파일이나 stream으로 읽어들인 line을 정렬하는 명령어 입니다.

sort [OPTION] file_name

정렬 옵션

  • -b
    • ignore leading blank(필드 앞 공백 무시)
  • -d
    • dictionary sort(사전순)
  • -r
    • 정렬 결과 reverse
  • -f
    • ignore case(대소문자 구분 안함)
  • -n
    • numeric sort
  • -g
    • general-numeric sort
    • 지수표기법(ee), NaN, infinity, -infinity을 포함한 숫자 sort
  • -M
    • month sort
    • ex. JAN, FEB, MAR, ..., DEC
  • -h
    • human-numeric sort
    • K, M, G, T, P, E, Z, Y
    • ex. 10K, 5M, 2G

정렬 이외 옵션

  • -k
    • 정렬할 key를 설정
    • 키 정의: F[.C][OPTS][,F[.C][OPTS]]
      • F : field number
      • C : character position
      • OPTS : ordering option
    • key 옵션 심화 참고
  • -t
    • 필드 구분자 설정
    • default: ' '
  • -u
    • unique
    • 정렬 기준 key가 중복될 경우 맨 먼저 찾아진 line만 출력
  • --debug
    • 정렬 기준 출력

2. sort 사용 예제

아래의 예제를 통해 sort 명령어를 사용하는 방법을 상세히 알아보도록 합시다.

예제에서는 정렬에 사용된 필드 확인을 위해 --debug옵션을 사용하였고, sort옵션에 집중하기 위해 파일내용은 pipe로 넘겼습니다.

melon.txt 은 아래와 같은 내용이 들어있는 파일입니다.

cat melon.txt
grape 10e100 nnnnn
abcde 230 mmmmm
apple -infinity fifif
ABCDE 999e-34 dmmmn
violin 33 test
    ABCDE infinity dmmmn
test 4.2 test
GRAPE 11.5 dmmmn
lily NaN aaaaa

2.1. character 정렬

첫번째 필드값을 이용하여 character 정렬을 해봅니다.

2.1.1. 기본

cat melon.txt | sort -k1,1 --debug

정렬 기준이 되는 필드만 설정하고 정렬해봅니다.

abcde 230 mmmmm
_____
_______________
ABCDE 999e-34 dmmmn
_____
___________________
    ABCDE infinity dmmmn
_________
________________________
apple -infinity fifif
_____
_____________________
grape 10e100 nnnnn
_____
__________________
GRAPE 11.5 dmmmn
_____
________________
lily NaN aaaaa
____
______________
test 4.2 test
____
_____________
violin 33 test
______
______________

일반 string 정렬에서는 필드에 leading blank도 포함됩니다.
그리고, 기본적으로 필드가 중복될 경우, line 순서대로 출력됩니다.

2.1.2. 중복 필드 제거

필요에 따라 옵션을 설정하여 출력 결과를 달리해봅니다.
sort 명령어도 당연히

cat melon.txt | sort -bfu -k1,1 --debug
  • -b : ignore leading blank
  • -u : unique
  • -f : ignore case

필드 앞 공백을 무시하고, 대소문자 구분하지 않고, 중복된 필드는 최초에 출력된 line만 출력되도록 합니다.

abcde 230 mmmmm
_____
apple -infinity fifif
_____
grape 10e100 nnnnn
_____
lily NaN aaaaa
____
test 4.2 test
____
violin 33 test
______

2.2. numeric 정렬

2.2.1. general-numeric sort

general-numeric 정렬은 지수표기법(ee), NaN, infinity, -infinity을 포함한 숫자를 정렬합니다.

cat melon.txt | sort -k2g,2 --debug
lily NaN aaaaa
     ___
______________
apple -infinity fifif
      _________
_____________________
ABCDE 999e-34 dmmmn
      _______
___________________
test 4.2 test
     ___
_____________
GRAPE 11.5 dmmmn
      ____
________________
violin 33 test
       __
______________
abcde 230 mmmmm
      ___
_______________
grape 10e100 nnnnn
      ______
__________________
    ABCDE infinity dmmmn
          ________
________________________

2.2.2. numeric sort

cat melon.txt | sort -k2n,2 --debug
    ABCDE infinity dmmmn
          ^ no match for key
________________________
apple -infinity fifif
      ^ no match for key
_____________________
lily NaN aaaaa
     ^ no match for key
______________
test 4.2 test
     ___
_____________
grape 10e100 nnnnn
      __
__________________
GRAPE 11.5 dmmmn
      ____
________________
violin 33 test
       __
______________
abcde 230 mmmmm
      ___
_______________
ABCDE 999e-34 dmmmn
      ___
___________________

numeric sort에서는 NaN, infinity가 사용 불가능하며, 지수표기법 ee가 인식되지 않습니다

2.2.3. human-numeric 정렬

K, M, G 와 같은 용량을 정렬하는 -h 옵션에 대한 예제입니다.

df -h | tail -n +2 | sort -k4hr,4 --debug

df -h를 이용하여 서버 용량을 조회하여 남은 용량(4번째 필드)을 내림차순으로 정렬해봅니다.

/dev/vda2        99G   13G   82G  14% /
                             ___
_______________________________________
tmpfs           919M     0  919M   0% /dev/shm
                            ____
______________________________________________
tmpfs           919M     0  919M   0% /sys/fs/cgroup
                            ____
____________________________________________________
devtmpfs        909M     0  909M   0% /dev
                            ____
__________________________________________
tmpfs           919M  105M  815M  12% /run
                            ____
__________________________________________
tmpfs           184M     0  184M   0% /run/user/1000
                            ____
____________________________________________________

-r : 내림차순


2.3. Month 정렬

ls -al | tail -n +4 출력 결과를 이용하여 Month 정렬을 해봅시다.

-rw-rw-r-- 1 jini jini    90 Jan  8 10:18 apple.txt
-rw-rw-r-- 1 jini jini     0 Oct 28 11:05 banana.sql
-rw-rw-r-- 1 jini jini    45 Jan  8 10:19 blue.txt
-rw-r--r-- 1 jini jini 15123 Dec 29 03:30 demo.log
-rw-rw-r-- 1 jini jini    54 Jan  2 03:39 green.txt
-rw-rw-r-- 1 jini jini    99 Nov  3 17:11 Hello.java
-rw-rw-r-- 1 jini jini  1823 Nov 20 14:17 login.html
-rw-rw-r-- 1 jini jini  7524 Oct 30 15:38 lpsum.txt
-rw-rw-r-- 1 jini jini   163 Jan 11 16:52 melon.txt
-rw-r--r-- 1 jini jini  1425 Jan  1 22:16 passwd
-rw-rw-r-- 1 jini jini   224 Jan  7 16:41 sort_test.txt
-rw-rw-r-- 1 jini jini 24362 Nov 17 16:12 spring.md
-rw-rw-r-- 1 jini jini  3640 Jan  1 06:31 TokenClass.java
-rw-rw-r-- 1 jini jini   200 Nov 17 10:31 ttt.tmp

ls -al | tail -n +4 | sort -k6M,6 -k7n,7 --debug

6번째 필드를 Month sort하고, 그 다음 sort 기준으로 7번째 필드를 numeric sort 합니다.

-rw-r--r-- 1 jini jini  1425 Jan  1 22:16 passwd
                             ___
                                  _
________________________________________________
-rw-rw-r-- 1 jini jini  3640 Jan  1 06:31 TokenClass.java
                             ___
                                  _
_________________________________________________________
-rw-rw-r-- 1 jini jini    54 Jan  2 03:39 green.txt
                             ___
                                  _
___________________________________________________
-rw-rw-r-- 1 jini jini   224 Jan  7 16:41 sort_test.txt
                             ___
                                  _
_______________________________________________________
-rw-rw-r-- 1 jini jini    45 Jan  8 10:19 blue.txt
                             ___
                                  _
__________________________________________________
-rw-rw-r-- 1 jini jini    90 Jan  8 10:18 apple.txt
                             ___
                                  _
___________________________________________________
-rw-rw-r-- 1 jini jini   163 Jan 11 16:52 melon.txt
                             ___
                                 __
___________________________________________________
-rw-rw-r-- 1 jini jini     0 Oct 28 11:05 banana.sql
                             ___
                                 __
____________________________________________________
-rw-rw-r-- 1 jini jini  7524 Oct 30 15:38 lpsum.txt
                             ___
                                 __
___________________________________________________
-rw-rw-r-- 1 jini jini    99 Nov  3 17:11 Hello.java
                             ___
                                  _
____________________________________________________
-rw-rw-r-- 1 jini jini   200 Nov 17 10:31 ttt.tmp
                             ___
                                 __
_________________________________________________
-rw-rw-r-- 1 jini jini 24362 Nov 17 16:12 spring.md
                             ___
                                 __
___________________________________________________
-rw-rw-r-- 1 jini jini  1823 Nov 20 14:17 login.html
                             ___
                                 __
____________________________________________________
-rw-r--r-- 1 jini jini 15123 Dec 29 03:30 demo.log
                             ___
                                 __
__________________________________________________

3. key 옵션 심화

F[.C][OPTS][,F[.C][OPTS]]

  • F : field number
  • C : character position
  • OPTS : ordering option

3.1. end field number 생략

각 line을 정렬하기 위해서는 정렬의 기준이 될 필드가 필요합니다.

키는 F[.C][OPTS][,F[.C][OPTS]] 형식으로 정의하는데, 정렬하고자 하는 필드 시작번호와 끝번호를 설정할 수 있습니다.

end field number를 생략할 경우, sort 기준에 따라 default end field number가 설정됩니다.

  • character sort 의 경우
    • 맨 마지막 field number가 설정됨
  • 그 외의 sort의 경우(numeric, human-numeric 등..)
    • start field number가 설정됨

아래의 예제를 확인해봅시다.

cat melon.txt | sort -k2 --debug

별도의 정렬 옵션을 설정하지 않을 경우 사전순으로 정렬되는데, 이는 character 정렬 일종이기 때문에, 맨 2번째 필드부터 맨 끝필드까지를 정렬기준으로 인식합니다.

grape 10e100 nnnnn
     _____________
__________________
GRAPE 11.5 dmmmn
     ___________
________________
abcde 230 mmmmm
     __________
_______________
violin 33 test
      ________
______________
test 4.2 test
    _________
_____________
ABCDE 999e-34 dmmmn
     ______________
___________________
    ABCDE infinity dmmmn
         _______________
________________________
apple -infinity fifif
     ________________
_____________________
lily NaN aaaaa
    __________
______________

general-numeric-sort는 자동으로 start field number까지를 필드로 인식합니다.

cat melon.txt | sort -k2g --debug
lily NaN aaaaa
     ___
______________
apple -infinity fifif
      _________
_____________________
ABCDE 999e-34 dmmmn
      _______
___________________
test 4.2 test
     ___
_____________
GRAPE 11.5 dmmmn
      ____
________________
violin 33 test
       __
______________
abcde 230 mmmmm
      ___
_______________
grape 10e100 nnnnn
      ______
__________________
    ABCDE infinity dmmmn
          ________
________________________

단일 필드로 정렬하고 싶다면 이렇게 암시적으로 이용하는 것 보다는 sort -k2g,2와 같이 명시적으로 end field number를 설정하는 것이 보다 직관적이므로 직접 필드를 모두 정의하는 것을 권장합니다.

3.2. C(character position)

sort를 사용하면서 아직 C 를 한번도 설정한적이 없었습니다.

character position. 말 그대로 문자 위치를 의미하며 정렬하고자 하는 필드의 시작점과 끝점을 설정할 수 있습니다.

보통 필드 전체를 가지고 정렬을 하기 때문에, 필요한 경우에만 사용하면 됩니다.

아래의 예제를 확인해 봅시다.

cat apple.txt | sort -k1.2r,1.4 --debug
grape 12345 nnnnn
 ___
_________________
apple viooo fifif
 ___
_________________
cocoa ooooo sksks
 ___
_________________
melon rrrrr dmmmn
 ___
_________________
abcde pine2 mmmmm
 ___
_________________

1번째 필드의 2번째 문자부터 1번째 필드의 4번째 문자까지를 정렬 기준으로 하여 내림차순 사전방식으로 정렬하였습니다.


++

  • sort: options '-Mn' are incompatible
  • how to sort multiple columns using sort command in unix & linux
  • sort command in Linux with example
728x90
반응형