여러 키, 텍스트 및 숫자로 GNU 정렬 사용

여러 키, 텍스트 및 숫자로 GNU 정렬 사용

먼저 이메일 주소를 기준으로 정렬한 다음 날짜를 기준으로 정렬하려는 일부 메일 로그 발췌 내용이 있습니다.

입력 데이터 예:

$ cat test3.txt
Oct 10 14:00:00 [email protected] bounced
Oct 10 13:00:00 [email protected] deferred
Oct 10 14:30:00 [email protected] bounced
Oct 10 12:00:00 [email protected] deferred
Oct 9 12:00:00 [email protected] deferred
Oct 9 14:00:00 [email protected] bounced
Oct 10 12:30:00 [email protected] deferred
Oct 10 13:30:00 [email protected] deferred
Oct 9 13:00:00 [email protected] deferred

현재 버전의 파일은 공백으로 구분됩니다. 그래서 제가 원하는 것은 먼저 네 번째 열을 기준으로 정렬한 다음 첫 번째 열(예: 월), 두 번째 열(숫자), 세 번째 열(타임스탬프에 특별한 처리가 필요하지 않은 한 숫자)을 기준으로 정렬하는 것입니다. 최선의 시도는 다음과 같습니다.

$ sort -k 4,4 -k 1,1M -nk 2 test3.txt
Oct 9 12:00:00 [email protected] deferred
Oct 9 13:00:00 [email protected] deferred
Oct 9 14:00:00 [email protected] bounced
Oct 10 12:00:00 [email protected] deferred
Oct 10 12:30:00 [email protected] deferred
Oct 10 13:00:00 [email protected] deferred
Oct 10 13:30:00 [email protected] deferred
Oct 10 14:00:00 [email protected] bounced
Oct 10 14:30:00 [email protected] bounced

"-k 4,4" 키 인수만 포함하면 이메일로 정렬되지만 다른 키를 추가하면 무시되는 것 같습니다. 단순화를 위해 이 예에서는 첫 번째 열을 무시할 수 있습니다. 두 번째 열이 네 번째 열보다 먼저 정렬되기 때문에 문제가 여전히 존재합니다.

내가 뭘 잘못했나요?

답변1

확실하지 않은 경우 --debug플래그를 사용하세요.

xb@dnxb:/tmp$ sort -k 4,4 -k 1,1M -nk 2 test3.txt --debug
sort: using ‘en_SG.UTF-8’ sorting rules
sort: key 3 is numeric and spans multiple fields
Oct 9 12:00:00 [email protected] deferred
               ^ no match for key
___
    _
_________________________________________
Oct 9 13:00:00 [email protected] deferred
               ^ no match for key
___
    _
_________________________________________
Oct 9 14:00:00 [email protected] bounced
               ^ no match for key
___
    _
________________________________________

이것은 작동합니다:

xb@dnxb:/tmp$ sort -b -k4,4 -k1M -k2n -k3n test3.txt --debug
sort: using ‘en_SG.UTF-8’ sorting rules
sort: key 3 is numeric and spans multiple fields
sort: key 4 is numeric and spans multiple fields
Oct 10 12:00:00 [email protected] deferred
                ________________
___
    __
       __
_________________________________________
Oct 10 13:00:00 [email protected] deferred
                ________________
___
    __
       __
_________________________________________

...

xb@dnxb:/tmp$ sort -b -k4,4 -k1M -k2n -k3n test3.txt
Oct 10 12:00:00 [email protected] deferred
Oct 10 13:00:00 [email protected] deferred
Oct 10 14:00:00 [email protected] bounced
Oct 10 12:30:00 [email protected] deferred
Oct 10 13:30:00 [email protected] deferred
Oct 10 14:30:00 [email protected] bounced
Oct 9 12:00:00 [email protected] deferred
Oct 9 13:00:00 [email protected] deferred
Oct 9 14:00:00 [email protected] bounced
xb@dnxb:/tmp$ 

위에서 언급한 대로 당신 -nk 2은 틀렸습니다 info sort.

A position in a sort field specified with ‘-k’ may have any of the
option letters ‘MbdfghinRrV’ appended to it, in which case no global
ordering options are inherited by that particular field.

그래서옵션 문자 nk그것 의에 첨부되어야한다위치. 순서가 중요합니다.

관련 정보