답변:
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는 시작하는 명령을 추적 할 수 있음)seq 30 | xargs -L1 bash -cs 'yes $1 | head -1000000 | paste - <(seq 1000000) | shuf' bash
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-
awk -v OFS="\t" '$1 != prev { key++ } { print key, $0; prev = $1 }
(추천되지 않은) 같은 것 .