첫 번째 열의 내림차순으로 데이터 정렬, 동일한 값의 경우 두 번째 열을 오름차순으로 사용


22

내가 명확히 할 수있게하십시오 :

사용 빈도가있는 일부 키워드가 있다고 가정합니다.

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

내가 원하는 것은 빈도를 기준 으로이 데이터를 내림차순으로 정렬하는 것입니다. 동일한 값이 있으면 두 번째 열을 오름차순으로 사용해야합니다.

sort -n -r foo.txt

첫 번째 부분이지만 두 번째 열도 있습니다 reversed.

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

다음과 같은 결과를 얻으려면 어떻게해야합니까?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

나는 -k논쟁 을 사용해야한다고 생각 하지만 어떻게 알아낼 수는 없습니다!

의 단독 sort명령을 사용하여 어떻게 수행 할 수 있는지 알고 싶습니다 bash. 그러나이 방법으로 만이 작업을 수행 할 수없는 경우 sort다른 명령은 Bourne 쉘과 호환 가능해야합니다.


[일부 OT] :이 특정 데이터와 동일하지만 숫자 비교 -g대신 GNU 정렬 (일반 숫자) 옵션을 사용하는 -n것이 더 안전합니다. 부동 소수점과 정수 모두에서 올바르게 작동합니다.
arielf

답변:


32

기준과 별도로 정렬 키를 지정하십시오.

sort -k1,1nr -k2,2 inputfile

이는 첫 번째 키가 역순으로 숫자로 정렬되고 두 번째 키는 기본 정렬 순서에 따라 정렬되도록 지정합니다.

POSIX 정렬 에서 인용 :

-k keydef

keydef 인수는 제한된 종류의 키 필드 정의입니다. 이 정의의 형식은 다음과 같습니다.

field_start [ type ] [ , field_end [ type ]]

여기서 field_startfield_end 는 행의 일부로 제한된 키 필드를 정의하고 (확장 된 설명 섹션 참조) type은 문자 목록 'b', 'd', 'f', 'i', '에서 수정 자입니다. n ','r '. 'b'수정자는 -b옵션 처럼 동작하지만, 옵션 이 연결된 field_start 또는 field_end 에만 적용됩니다 . 다른 수정자는 해당 옵션과 동일하게 동작하지만 이들이 첨부 된 키 필드에만 적용됩니다. field_start , field_end 또는 둘 다로 지정된 경우이 효과가 있습니다.옵션은 적용되지 않습니다. 구현은 최소한 9 번의 -k옵션 발생을 지원 해야하며 이는 명령 행 순서에서 중요합니다. -k옵션을 지정 하지 않으면 전체 줄의 기본 정렬 키가 사용됩니다.

여러 키 필드가있는 경우 모든 이전 키가 동일하게 비교 된 후에 만 ​​이후 키를 비교해야합니다. 경우를 제외하고 -u옵션을 지정, 그렇지 않으면 동일한 비교 라인 옵션없는 경우는로 주문해야한다 -d, -f, -i, -n, 또는 -k했다 현재 (그러나와 -r 여전히 유효한,이 지정된 경우)와 상당한 라인의 모든 바이트 비교. 여전히 동일하게 비교되는 행이 작성되는 순서는 지정되지 않습니다.

이것은 다음을 생성합니다 :

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash

감사. 트릭을 했어. 수락하려면 10 분 정도 기다려야합니다!
Pouya

@StephaneChazelas 지적 해 주셔서 감사합니다. 참조를 업데이트했습니다.
devnull 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.