정렬이 정렬 순서를 모르는 경우 GNU 정렬 안정적인 정렬 못합니다. 일반적인 방법 (스택에서 비슷한 질문으로)은 다음과

2 열 파일이 있습니다. 파일은 이미 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


답변

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는 시작하는 명령을 추적 할 수 있음)

답변

Schwartzian 변환을 사용할 수 있습니다 (기본적으로 주석에서 언급 한 데코레이션-정렬-비 장식 접근법이지만 다중 호출과는 달리 단일 호출 을 사용하여 muru의 훌륭한 답변 보다 성능이 우수 sort합니다)- awk접두사 열 추가 첫 번째 열의 값이 변경되면 증분되고 접두사 열과 “두 번째”열 (순서 위치가 3접두사 열의 존재 로 인해 일시적으로 이동 된 순서)을 기준으로 정렬 한 다음 마지막으로 접두사 열을 제거합니다.

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