내용에 관계없이 파일을 줄별로 정렬합니다.

내용에 관계없이 파일을 줄별로 정렬합니다.

알파벳순으로 정렬하고 싶은 매우 큰 파일이 있습니다. 탭으로 구분된 파일이지만 파일이 공백이든 다른 문자이든 줄의 첫 번째 문자부터 시작하여 정렬되어 있는지 확인해야 합니다.

입력 파일 예:

2090802 V19 I must be the third in the group 
20908 02    V18 I must be the first in file, as col 1 is another value
2090802 V17 I must be the second in the group 
2090802 V16 I must be the first in the group of 2090802

명령을 사용하면 sort test.txt > test-s.txt다음과 같은 결과가 출력됩니다.

2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group 
20908 02    V18 I must be the first in file, as col 1 is another value
2090802 V19 I must be the third in the group 

정렬기는 첫 번째 열의 값이 동일하고(3행의 공백 무시) 다음 열(V16, V17, V18 및 V19)을 사용하여 파일을 정렬하는 것으로 보입니다.

그러나 나는 그 값이 20908 02구별되는 것으로 간주되기를 원하며 예상되는 결과는 다음과 같아야 합니다.

20908 02    V18 I must be the first in file, as col 1 is another value
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group 
2090802 V19 I must be the third in the group 

-b매개변수를 사용하고 다른 구분 기호를 지정해 보았지만 -t여전히 원하는 결과를 얻지 못했습니다.

공백을 무시하지 않고 줄의 모든 문자를 고려하여 파일을 정렬하는 방법은 무엇입니까?

답변1

정렬 순서는 로케일에 따라 다릅니다. 대부분의 로케일에서는 첫 번째 근사치에서 간격이 무시됩니다( IGNORE처음 3개의 가중치로 SPACE(U+0020) 및 TAB(U+0009) 참조)ISO1465).

각 문자(실제로는 바이트)를 계산하고 바이트 값의 정렬 순서에 따라 순서를 지정하려는 경우(UTF-8로 인코딩된 텍스트의 경우 이는 유니코드 코드 포인트 값에 따른 순서와 일치합니다) , C일명 POSIX영역 설정을 사용하십시오.

LC_ALL=C sort your-file

LC_ALL영향력 설정모두현지화 카테고리. 정렬 순서는 카테고리에 의해 영향을 받지만 LC_COLLATE여기서는 모든 바이트 시퀀스를 문자로 디코딩하고 값별로 (바이트별로) 정렬할 수 있도록 보장하므로 설정 LC_CTYPE(문자 및 바이트 시퀀스가 ​​인코딩/디코딩되는 방식에 영향을 줌)하는 것이 C좋습니다. . 다른 방법을 설정하면 LC_COLLATE=C sort your-file작동하지 않습니다.LC_ALL

답변2

를 사용하는 것이 더 빠르고 효율적일 수 있지만 또 다른 옵션은 Tell을 LC_ALL=C사용하여 첫 번째 필드만 정렬하고 다른 필드는 정렬하지 않는 것입니다.-ksort

$ sort -k1,1 file
20908 02    V18 I must be the first in file, as col 1 is another value
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group 
2090802 V19 I must be the third in the group 

관련 정보