정렬 시 GNU 정렬 안정적인 정렬은 정렬 순서를 모릅니다.

정렬 시 GNU 정렬 안정적인 정렬은 정렬 순서를 모릅니다.

두 개의 열로 구성된 파일이 있습니다. 파일은 내가 원하는 방식으로 열 1에 정렬되어 있습니다. 열 1의 각 범주 내에서 열 2를 정렬하고 싶습니다. 그러나 sort열 1의 정렬 순서는 인식되지 않습니다.

(스택에 대한 유사한 질문에서 나온) 일반적인 접근 방식은 다음과 같습니다.

sort --stable -k1,1 -k2,2n

그러나 k1의 순서는 임의적이기 때문에 지정할 수 없습니다.

입력 예:

C 2
C 1
A 2
A 1
B 2 
B 1

그리고 출력:

C 1
C 2
A 1
A 2
B 1 
B 2

답변1

awk를 사용하여 각 블록에 대해 새로운 정렬을 시작할 수 있습니다.

% awk -v cmd="sort -k2,2" '$1 != prev {close(cmd); prev=$1} {print | cmd}' foo
C 1
C 2
A 1
A 2
B 1
B 2
  • $1 != prev {close(cmd); prev=$1}- 저장된 값이 다른 경우 새로운 블록이 생성되므로 이전에 시작된 블록을 모두 닫습니다.sort
  • {print | "sort -k2,2"}'출력을 에 파이프 sort하고 아직 실행 중이 아닌 경우 시작합니다(awk는 시작된 명령을 추적할 수 있습니다).

답변2

당신이 사용할 수있는슈워츠 변환(이것은 기본적으로 귀하의 의견에서 언급한 장식-정렬-장식 없음 접근 방식이지만 아마도 그보다 더 나을 것입니다.무루의 좋은 대답sort다중 호출 대신 단일 호출을 사용하므로 ) - awk첫 번째 열의 값이 변경됨에 따라 증가하는 접두사 열을 추가하고 접두사 열을 기준으로 정렬합니다.다음은 "두 번째" 열입니다.(접두사 열의 존재로 인해 서수 위치가 일시적으로 로 이전됨 3) 최종적으로 접두사 열이 제거됩니다.

awk '{print ($1 in a? c+0: ++c)"\t" $0; a[$1]}' file | sort -k1,1n  -k3,3 | cut -f 2-

관련 정보