Answers:
您可以使用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变换(这基本上是您在评论中提到的decorate-sort-unecorate方法,但由于使用了单个调用而不是多个调用,因此可能比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 }
(未经测试)的东西。