Linux의 GNU는 sort
내 csv 파일에 대해 예상된 결과를 제공하지 않습니다. 이 상황/문제를 해결하는 데 도움을 주실 수 있나요?
입력 파일
[nscruser]$ cat cemp1.txt
10,30
50,900
20,1050
목적위 파일의 첫 번째 필드를 숫자순으로 정렬해야 합니다.
[nscruser]$ sort -t',' -k1 -n cemp1.txt
10,30
50,900
20,1050
예상 출력하지만 첫 번째 열을 숫자로 정렬하므로 아래와 같은 출력이 예상됩니다.
10,30
20,1050
50,900
왜 차이가 발생하는지 말해 줄 수 있나요?
답변1
sort
매뉴얼 페이지(GNU coreutils 8.32)를 보면 ,
-k, --key=KEYDEF 키별 정렬 KEYDEF는 위치와 유형을 제공합니다.
...
KEYDEF는 시작 및 중지 위치를 나타내는 F[.C][OPTS][,F[.C][OPTS]]입니다. 여기서 F는 필드 번호이고 C는 필드의 문자 위치입니다. 둘 다 원점 1이고 정지 위치는 기본적으로 줄 끝으로 설정됩니다. -t와 -b가 모두 유효하지 않은 경우 필드의 문자는 이전 공백의 시작 부분부터 계산됩니다. OPTS는 이 키에 대한 전역 정렬 옵션을 재정의하는 하나 이상의 단일 문자 정렬 옵션[bdfgiMhnRrV]입니다. 키가 제공되지 않으면 전체 행이 키로 사용됩니다. 잘못된 키 사용을 진단하려면 --debug를 사용하세요.
먼저, --debug
제안된 대로 사용할 수 있습니다.
$ sort -t',' -k1 -n --debug cemp1.txt
sort: text ordering performed using ‘en_IE.UTF-8’ sorting rules
sort: key 1 is numeric and spans multiple fields
10,30
_____
_____
50,900
______
______
20,1050
_______
_______
이는 우리에게 단서를 제공합니다. "키 1은 숫자이며 여러 필드에 걸쳐 있습니다."
매뉴얼 페이지에는 "중지 위치는 기본적으로 줄 끝으로 설정됩니다."라고 명시되어 있습니다. 따라서 정지 위치를 추가해야 합니다.
$ sort -t',' -k1,1 -n cemp1.txt
10,30
20,1050
50,900
답변2
명령 앞에 LANG
또는 LC_ALL
로캘 변수를 추가해 볼 수 있습니다.
LANG=C sort -t',' -k1,1 -n cemp1.txt
또는
LC_ALL=C sort -t',' -k1,1 -n cemp1.txt
사용되는 변수는 명령 및/또는 운영 체제 버전에 따라 다릅니다. HP-UX 11.31(Unix 시스템 5): man 3C locale
압축 풀기
LANG LC_MESSAGES
LC_ALL LC_MONETARY
LC_COLLATE LC_NUMERIC
LC_CTYPE LC_TIME