유닉스를 알파벳순으로 정렬한 다음 숫자순으로 정렬했는데 의도한 대로 작동하지 않습니다.

유닉스를 알파벳순으로 정렬한 다음 숫자순으로 정렬했는데 의도한 대로 작동하지 않습니다.

중복된 질문이라면 죄송합니다. 여기나 설명서에서 원하는 답변을 찾을 수 없습니다.

다음과 같은 파일이 있습니다.

chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr4_oligo95    50  100
chr5_oligo1 50  100
chr4_oligo4 150 200

원하는 출력은 다음과 같습니다.

chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo95    50  100
chr4_oligo4 150 200
chr5_oligo1 50  100

시작 부분의 패턴(예: chr#_oligo#)은 chr# 측면에서만 중요합니다. 즉, 모든 chr1이 먼저 오고 그 다음 chr2, 그 다음 chr3 등이 와야 하지만 해당 하위 문자열을 다음과 같이 숫자로 그룹별로 정렬하고 싶습니다. 위의 원하는 출력으로 표시됩니다. 그래서 첫 번째 열의 경우 알파벳순으로 정렬한 다음 해당 순서(chr1->chrN)를 유지하면서 각 데이터 덩어리를 숫자순으로 정렬하는 방법을 알고 싶습니다.

내 표현이 이 문제에 가장 적합하지 않거나 중복된 경우 사과드립니다. 견딜 수 없는

sort -k1,1 -nk2

숫자로 올바르게 정렬되지만 첫 번째 정렬은 그대로 유지되지 않습니다(첫 번째 열을 뒤죽박죽으로 만들고 열 2와 3이 있는 모든 줄을 다음과 같이 배치합니다.

50   100

저는 Mac OS X를 사용하고 있습니다.

편집: 내가 찾고 있는 내용을 더 많이 표시하기 위해 첫 번째 열의 일부 예를 변경하고 싶습니다. gsort -V는 첫 번째 열의 이름이 숫자순으로 되어 있으면 훌륭하게 작동했지만 내 데이터 세트에서는 항상 그런 것은 아닙니다.

기본적으로 각 하위 그룹(이 경우 chr1, chr2 등)을 열 2별로 반복적으로 정렬하고 싶습니다. 각각에 대해 grep을 수행한 다음 열 2에서 정렬하면 이 작업을 쉽게 수행할 수 있다는 것을 알고 있지만 정렬이나 다른 유닉스 명령만으로 이 작업을 수행할 수 있는지 알고 싶습니다.

답변1

sort -k1,1 -nk2와 동일합니다 sort -k1,1 -n -k2, 동일 sort -n -k1,1 -k2, 와 같습니다.숫자모든 키에 대해 전역적으로 정렬이 활성화됩니다.

두 번째 키를 숫자로만 정렬하려면 n다음과 같이 해당 정렬 키 설명을 추가해야 합니다 .

sort -k1,1 -k2n

또는:

sort -k1,1 -k2,2n

n기본 필드 구분 기호를 사용하는 경우 2와 동일합니다 2,2. 2는 두 번째 필드에서 시작하는 줄의 일부이지만 숫자로 해석하면 두 번째 필드만( 2,2)과 동일합니다.

여기에서 다음을 사용하여 첫 번째 필드 뒤에 있는 숫자를 숫자순으로 정렬 chr한 다음 나머지 첫 번째 필드에서는 알파벳순으로, 두 번째 필드에서는 숫자순으로 정렬할 수도 있습니다.

sort -k1.4n -k1,1 -k2n

답변2

첫 번째 필드에서 알파벳순으로 정렬하고 두 번째 필드에서 숫자순으로 정렬합니다(출력에서 -- chr4_oligo95는 ch4_oligo4 앞에 있음).

sort -k1,1 -k2n,2n file 
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo4 150 200
chr4_oligo95    50  100
chr5_oligo1 50  100

관련 정보