GNU 정렬을 사용하여 단일 키로 정렬 / 다른 키의 원치 않는 정렬 방지


9

이미 정렬 된 데이터가 포함 된 파일이 있고 다른 키의 데이터 순서를 손상시키지 않고 한 키의 값에 따라 파일을 다시 정렬하고 싶습니다.

지정하지 않은 키 값을 기준으로 GNU 정렬이 행 정렬을 수행하지 못하게하려면 어떻게합니까? 또는 정렬 할 때 키 범위를 무시하도록 GNU 정렬을 지정하려면 어떻게해야합니까?

파일 data.txt :

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

예상 출력 :

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

명령:

sort -k 1,1 <data.txt

결과 : 원하지 않는 정렬은 요청하지 않았습니다.

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

답변:


21

안정적인 정렬 이 필요합니다 . 보낸 사람 man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

즉.:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

참고 당신은 아마 또한 원하는 것을 -n--numeric-sort키가 숫자 인 경우 (기본으로 2 (10)를 비교할 때, 예를 들어, 예기치 않은 결과를 얻을 수 있습니다 - 어휘 - 정렬 순서). 어떤 경우에는 그냥하기 만하면됩니다.

sort -sn <data.txt

전체 행의 숫자 해석이 첫 번째 필드의 숫자 해석과 동일하므로 첫 번째 필드를 추출 할 필요가 없습니다.



나는 문서를 읽었지만 "안정한"에 대한 적절한 정의는 나의주의를 피했다. 빠르고 간결하며 잘 인용 된 답변에 감사드립니다. 실제 데이터의 첫 번째 키는 지역화 된 문자열이므로 숫자가 작동하지 않습니다.
Wil

4

옵션 sort이없는 (비 GNU) 구현의 경우 -s항상 다음을 수행 할 수 있습니다.

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

즉, 줄 번호를 앞에 두어 두 번째 정렬 키로 만들고 나중에 제거하십시오.

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