세 번째 열을 기준으로 정렬


131

나는 거대한 4 열 파일에 직면하고 있습니다. 세 번째 열을 기준으로 정렬 된 파일을 stdout에 표시하고 싶습니다.

cat myFile | sort -u -k3

그 트릭을 수행하기에 충분합니까?


4
이것을로 쓸 수 있습니다 sort -u -k3 < myFile.
gerrit

6
마찬가지로 sort -u -k3 myFile,
Sebastian Graf

답변:


166
sort -k 3,3 myFile

현재 로케일에 의해 정의 된 정렬 순서에 따라 열이 공백 시퀀스 (POSIX / C 로케일의 ASCII SPC 및 TAB 문자)로 구분되어 있다고 가정하면 3 번째 열로 정렬 된 파일을 표시합니다 .

선행 공백은 열에 포함 되며 (기본 구분 기호는 공백이 아닌 공백에서 공백으로 전환됨) 비교를 위해 공백이 무시되지 않는 로케일에서 차이를 만들 수 있습니다. -b옵션을 사용하여 무시하십시오. 주요 공백.

쉘과 완전히 독립적입니다 (모든 쉘은 해당 명령 행을 동일하게 구문 분석하며 일반적으로 쉘에는 sort명령이 내장되어 있지 않습니다 ).

-k 33 번째 열 (선행 공백 포함)로 시작하는 행 부분을 정렬하는 것 입니다. C 로케일에서 공백 및 탭 문자는 인쇄 가능한 모든 문자보다 순위가 높으므로 일반적으로 -k 3,3동일한 세 번째 필드가있는 행은 제외하고 동일한 결과를 제공합니다.

-u동일하게 정렬되는 여러 항목이있는 경우 (즉, 정렬 키가 동일하게 정렬되는 곳 (즉 반드시 같음과 동일하지는 않음 )) 한 줄만 유지하는 것입니다 .

cat죄수의 명령입니다 고양이 enate은. 당신은 여기에 필요하지 않습니다.

열이 다른 것으로 분리 된 -t경우 구분 기호를 지정하는 옵션 이 필요합니다 .

주어진 예제 파일 a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

-u -k 3:

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

두 번째 줄과 세 번째 줄은 같은 세 번째 열을 갖지만 여기에서 정렬 키는 세 번째 열에서 줄 끝까지이므로 -u둘 다 유지합니다. 내 로케일의 첫 번째 패스에서 공백이 무시 ␠ca␠d되기 ␠c␠c때문에 cad정렬 cc합니다.

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

위의 세 번째 열이있는 사람들은 하나만 유지됩니다 ␠c. ␠␠c(2 개의 선행 공백)이있는 것을 유지 하는 방법에 유의하십시오 .

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

순서 a b c da c c c반대 순서를 확인하십시오 . 첫 번째 경우, 때문에 ␠c␠c전 종류 ␠c␠d, 두 번째 경우에 정렬 키 (동일하기 때문에 ␠c전체 풋의 라인을 비교 마지막 수단 비교) a b c da c c c.

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

공백을 무시하면 처음 3 행의 정렬 키는 동일 c하므로 ( ) 마지막 수단 비교를 기준으로 정렬됩니다.

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

C 로케일에서는 코드 포인트 값 (공백이보다 낮은 코드 포인트가있는 위치)을 기준으로 문자 (단일 바이트)가 정렬되는 패스가 하나만 있으므로 ␠␠c이전에 ␠c정렬 c합니다.


blank로케일에 따라 공백 및 탭 외에 다른 문자를 포함 할 수있는 열이 분리되어 있습니다.
jfs

1
좋아요, +1 무엇을 설명 할 수 3,3있습니까? 왜 안돼 3?
terdon

@terdon, 예제가 포함 된 확장 된 설명을 참조하십시오.
Stéphane Chazelas

@JFSebastian, 당신이 맞습니다.
Stéphane Chazelas

아, 나머지 라인이 아닌 3 일에만 정렬하려면 감사합니다.
terdon

4

텍스트 파일 (4 자)에서와 같이 "열"을 이해한다면 다음 네, 솔루션 작동합니다 (또는 sort -u -k3 myFile허용하는 sort랜덤 액세스 일부 메모리 절약 마법을 수행). 데이터베이스에서와 같이 "열"을 이해하는 경우-데이터의 전체 엔터티와 구분 기호 및 가변 열 너비가 이해되면 더 큰 것이 필요합니다. 예를 들어 크기별로 ls -l을 정렬합니다.

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(사소한 것과 동일 ls -lS하지만 예제를 훌륭하게 제공합니다.)


5
아니요, 기본적으로 정렬 은 공백으로 구분되며 문자 열이 아니며 세 번째 문자 열에서 정렬하려면 구문은 다음과 같습니다 sort -k 1.3,1.3. ls -l | sort -k5,5n크기를 정렬합니다.
Stéphane Chazelas

awk솔루션은 내가 쉽게 복잡한 정렬 요구 사항에 맞게 수정 needed-- 정확히 무엇인가
jchook

2
sort -g -k column_number 

특정 열을 사용하여 숫자가있는 목록을 정렬하는 올바른 명령입니다


1
-k 사용은 이미 잘 다루었 으므로이 명령이 어떻게 다르거 나 더 나은지 설명하면 도움이 될 것입니다. OP의 실제 질문을 처리하기 위해 실제 열 번호를 포함 할 수도 있습니다.
Jeff Schaller

이것은 필자의 페이지에서 사용했다 : p "-g, --general-numeric-sort, general numeric value에 따라 비교"필자의 경우에 필요한 내용이었습니다.
joels


0
$ sort -k 1.3,1.3 myfile

파일에 구분 기호가 없으면 세 번째 열에서 myfile 파일을 정렬합니다.

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

종류의 맨 페이지 :

[...] -k, --key = POS1 [, POS2] POS1 (원점 1)에서 키를 시작하고 POS2 (기본 줄 끝)에서 키를 종료합니다. [...] POS는 F [.C] [ OPTS], 여기서 F는 필드 번호이고 C는 필드의 문자 위치입니다. 둘 다 원점 1입니다. -t 또는 -b가 유효하지 않은 경우 필드의 문자는 선행 공백의 시작부터 계산됩니다. OPTS는 하나 이상의 단일 문자 주문 옵션으로, 해당 키의 전체 주문 옵션보다 우선합니다. 키가 없으면 전체 줄을 키로 사용하십시오.

--key = 1.3,1.3을 사용하면 하나의 필드 (전체 행) 만 있고이 필드의 세 번째 문자 위치를 비교한다고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.