Unix를 사용하여 쉼표로 구분 된 파일에서 숫자로 정렬


8

다음과 같은 쉼표로 구분 된 파일이 있습니다.

100,00869184
6492,8361
1234,31
200,04071

내가 사용하려면 sort이 파일 정렬 수치 바이 만 첫 번째 열을 .

원하는 결과 :

100,00869184
200,04071
1234,31
6492,8361

정렬을 사용하여 어떻게 이것을 달성합니까? 쉼표를 구분 기호 대신 천 단위 구분 기호처럼 취급하는 것처럼 보입니다.

모두 sort -t',' -nsort -t',' -nk1'저에게이 제공 :

1234,31
200,04071
6492,8361
100,00869184

기본값 (매개 변수 없음)으로 정렬하거나 사용 sort -t','하면 다음 을 얻을 수 있습니다.

100,00869184
1234,31
200,04071
6492,8361

그리고 숫자로 정렬하면 다음과 같이됩니다 sort -n.

1234,31
200,04071
6492,8361
100,00869184

원하는 결과를 얻기 위해 sort를 어떻게 사용할 수 있습니까?

추가 편집 : 약 700 만 줄의 정렬 된 목록을 작성하는 일회성 작업이므로 해결 방법 또는 기타 정통 방법이 완벽하게 허용됩니다.


여기에 나오는 예 는 문자와 문자 -t사이에 공백이있는 옵션 을 보여주는 것 같습니다-t
SeanC

첫 번째 생각-컷을 사용하십시오. 주어진 구분 기호를 기반으로 특정 열만 선택합니다. 또한 "Artem Ice"의 대답은 tr입니다. 나는 tr을 좋아한다. 그래도 이것을 작성하고 테스트하기에는 너무 게으르다. 건배!
Vorac September

답변:


9

이것은 확실히 더러운 해결 방법이지만 로케일에 대한 @slhck의 팁 덕분 에이 작업을 수행하는 방법을 찾았습니다. 더 나은 답변이 나오면 다른 사람들에게 더 도움이 될 것입니다. 이것은 내 특정 문제에서만 작동하기 때문에 확실히 받아 들일 것입니다.

로케일을 스페인어 (볼리비아)로 설정하여 쉼표를 소수점처럼 처리 한 다음 표준 숫자 정렬로 트릭을 수행했습니다.

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361

아, 독일어 로케일이나 유사한 것을 사용하는 것이 좋습니다. 매우 희귀 한 Unix 버전이므로 테스트 할 수 없거나 사용 가능한 도구가 없으면 지금 다른 것을 생각할 수 없습니다.
slhck

@slhck 그것은 유닉스에서 멈춰있는 대부분의 문제의 핵심 인 것 같습니다 :) 솔루션에 관계없이 도움을 주셔서 감사합니다.
dpatchery

6

GNU sort는 이것을 기본적으로 수행합니다 :

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

버전:

$ gsort --version
sort (GNU coreutils) 8.19

주의 사항 : 정렬이 예상대로 작동하지 않으면 locale아마도와 다른 것으로 설정되어있을C입니다. 왜 이런거야? locale문자, 숫자, 소수 자릿수 등의 정렬 및 해석을 정의합니다.

이를 확인하려면 locale터미널에 입력하십시오 . 로 LC_NUMERIC설정되어 en_US.UTF-8있습니까? 잘못된 정렬 순서를 설명합니다. 다시 설정하십시오 C.

export LC_NUMERIC=C

그런 다음 sort명령을 다시 시도 하십시오. 전역 locale을 로 설정 하려면 다음 C을 수행하십시오.

export LC_ALL=C

내 환경에서 GNU에 액세스 할 수 없습니다. 완료되면 쉽게 얻을 수있는 것입니까? 누군가가 나를 도와주고 싶다면 채팅에 HMU가 있습니다 ... 저는 UNIX 초보자입니다.
dpatchery

나는 그것이 단지 locale문제 라고 확신합니다 . 하지만 sort --version실제로는 무엇입니까?
slhck

sort --version은 불법적 인 주장을합니다. --과거에도 명령이 작동하지 않았습니다. 매뉴얼 페이지를 확인했는데 명시 적으로 호출 된 버전이 없지만 "HP-UX 11i 버전 2 : 2003 년 8 월"이 표시되면 도움이됩니다. LC_NUMERIC이 "C"로 설정되어 있습니다.
dpatchery

예를 들어 독일어 로캘 ,은 소수점 구분 기호로 사용 됩니다. 그래도 HP-UX를 사용한 적이 없습니다.
slhck

1

-g숫자 정렬을 수행한다고 가정 하는 옵션을 추가하십시오 .

시험:

sort -t',' -g <whatever>

아닌가 -n숫자 정렬은? -g는 잘못된 옵션을 제공합니다.
dpatchery

-g는 IS general-numeric-sort옵션과 실제의 최근 버전에서 사용할 수 있어야합니다 sort. @dpatchery
slhck

나는 거의 확실히 최신 버전 :하지 않아도이 작품의 내 자리에있다
dpatchery

0

Delimeter를 교체하십시오.

cat commafile | tr , " " | sort -n 

-당신을 도울 것입니다.

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