2022년 3월 17일 목요일

sort -V의 힘 - natural sort of (version) numbers within the text

sort는 매우 유용한 명령어이지만 다루기에 까다로운 점도 없지 않다. 버그가 있다는 소문도 있다. GFF3sort라는 Perl 스크립트의 GitHub 사이트에 이런 글이 있다.

However, either the GNU sort or the gt tool has a bug: Lines with the same chromosomes and start positions would be placed randomly. Therefore, parent feature lines might sometimes be placed after their children lines. 

여러 컬럼으로 이루어진 텍스트 파일을 원하는 컬럼 기준으로 정렬할 때 sort는 힘을 발휘한다. 만약 3번째 컬럼을 기준으로 정렬하려면 'sort -k3,3 <filename>'이라고 입력하는 것이 정석이다. '-k 3' 하나만 입력하면 될 것 같은데, 여기에는 약간 복잡한 내용이 숨어 있다. 이 글에서는 그것까지는 상세하게 다루지 않겠다.

1, 2, 3... 10, 11, 12...를 정렬하면 컴퓨터는 1, 11, 12... 이런 식으로 결과를 낸다. 인간이 자연스럽게 느끼는 숫자의 오름차순으로 만들려면 sort 명령어에서 다른 옵션을 주어야 한다. 그런데 정렬 기준이 되는 컬럼이 문자와 숫자의 복합체라고 가정해 보자. 예를 들어서 vsearch로 dereplication한 염기서열 파일의 ID를 생각해 보자.

NR_1;size=2

빨간색으로 표시된 숫자를 기준으로 sort를 하고 싶다. 아예 Perl 스크립트를 짜서 해결할 수도 있지만 sort 명령어 안에 해결책이 숨어 있을 것만 같았다. 구글을 뒤져 보니 StackOverflow에 이런 글이 있었다.

How to sort a file, based on its numerical values for a field?

그것은 바로 'sort -V'를 쓰는 것이었다. 'man sort'에서는 이에 대한 설명이 나오지 않는다. 'info sort'를 해야 겨우 알 수가 있는 기능이다. 이를 사용하니 문자와 숫자가 복잡하게 얽힌 필드를 기준으로 숫자 오름차순의 정렬을 할 수 있었다.

sort, join 등 문자를 직접적으로 다루는 명령어들은 문자열의 사전적 배열 순서 또는 Locale 등에 민감하므로, 그 용법을 정확히 알고 써야 한다. 

댓글 없음: