[bash: sort] 특정 항목(field)을 기준으로 정렬하기 리눅스 bash script

sort 명령에 별다른 옵션을 주지 않으면 행 전체를 기준으로 정렬하게 되는데, 옵션을 추가해서 특정 항목을 기준으로 정렬을 할 수 있다.

아래의 예시를 보자.

# my_list.txt 내용 확인
cat my_list.txt
strawberry 46
mango 134
apple 33

# my_list.txt 내용 정렬
cat my_list.txt | sort
apple 33
mango 134
strawberry 46

아무런 옵션을 주지 않으면 행 전체를 문자열로 간주하고 정렬한다. 따라서 my_list.txt에서 a로 시작되는 행이 가장 먼저 출력되고 이후 알파벳 순으로 정렬되었다.
 
위의 예시에서 두번째 항목에 있는 수자를 기준으로 가장 큰 수부터 출력되도록 정렬하려면, 몇가지 옵션을 추가해 주어야 한다.

# 2번째 항목 기준(-k 2), 수자로 간주하여 정렬(-g), 제일 큰 수부터(-r)
cat my_list.txt | sort -k 2 -g -r
mango 134
strawberry 46
apple 33

-k 옵션으로 정렬 기준이 되는 항목을 지정한다. 항목 구분은 공백(space) 또는 탭(tab)이다. 위의 예시처럼 -k 2 이렇게 옵션을 주면 2번째 항목을 기준으로 잡게 된다. 그 외에 해당 항목을 문자열이 아니라 수자로 간주하기 위해 -g 옵션을, 정렬 순서를 바꾸기 위해 -r 옵션을 추가했다. (-g, -r 옵션에 대한 내용은 이전 게시물을 참고하자. 여기로)

항목 구분자(field separator)가 문자일 경우엔 어떻게 할까? 아래의 예시를 보자.

cat my_list2.txt
strawberry:46
mango:134
apple:33

my_list2.txt 파일은 구분자가 콜론(:)이다. 이 경우엔 정렬을 할 때 -t 옵션으로 구분자를 지정해 주면 된다.

# 콜론을 구분자로 사용(-t ":")
cat my_list2.txt | sort -t ":" -k 2 -g -r
mango:134
strawberry:46
apple:33



핑백

  • 반달가면 : [bash: uniq] 중복되는 행 또는 중복되지 않는 행만 골라서 출력하기 2016-03-30 23:35:47 #

    ... 해서 나오면 하나의 공백으로 간주된다). 예를 들어 위의 예시에서 두번째 항목만을 기준으로 중복 여부를 확인하려면 -f 1 이렇게 된다. sort 명령에서도 -k 옵션을 이용해서 두번째 필드를 기준으로 정렬하면 된다. # 맨 앞 1개의 필드를 건너 뛰고(-f 1), 중복이 발생하지 않은 행만 골라서 출력(-u) cat test.txt ... more

덧글

  • 열정하나 2017/07/04 15:41 # 삭제 답글

    오 좋은 정보 감사합니다 -g랑 -t 배우고 가요!
  • 반달가면 2017/07/04 21:38 #

    아 네. 도움 되었다니 다행입니다~
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

1431045
3392
1828171

ad_widget_2