いくつかの「純粋な」awk
ソリューションを次に示します。
サンプルデータのように、インデックスが常に同じ増分整数シーケンス(6115-6119)である場合、アルゴリズムの「ショートカット」を使用できます。
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
これは
- 配列にすべての行を追加し
a
、インデックス位置6115-6119に分散します
- 4行ごと(
!(NR%4)
)に、配列の内容をループして、目的の順序で印刷します。
数値インデックスが常に4つの同じインデックスであるが、増分整数シーケンスではない場合、並べ替える必要があります。
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
注:これはGNU awkを使用したもので、他はサポートしない可能性がありasort
ます。
4つのブロックごとに異なる数値IDを使用できる場合:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
注:@Gillesのdelete
TIL self-answer(+2)この使用は(まだ)POSIX ではありませんが、普遍的にサポートされています。
正しい™の使用を備えたバージョンdelete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
より多くのメモリとディメンションを使用する、削除のないバージョン:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}