これは純粋に行うことができawk
ますが、@ steveが言ったように、理想的ではありません。 gawk
ソート機能が制限されておりawk
、ソートはまったく組み込まれていません。そうは言っても、ここに比較関数を使用した(かなりハック的な)ソリューションがありますgawk
:
[ghoti@pc ~/tmp3]$ cat text
1 a f 1 12 v
2 b g 2 10 w
3 c h 3 19 x
4 d i 4 15 y
5 e j 5 11 z
[ghoti@pc ~/tmp3]$ cat doit.gawk
### Function to be called by asort().
function cmp(i1,v1,i2,v2) {
split(v1,a1); split(v2,a2);
if (a1[2]>a2[2]) { return 1; }
else if (a1[2]<a2[2]) { return -1; }
else { return 0; }
}
### Left-hand-side and right-hand-side, are sorted differently.
{
lhs[NR]=sprintf("%s %s %s",$1,$2,$3);
rhs[NR]=sprintf("%s %s %s",$4,$5,$6);
}
END {
asort(rhs,sorted,"cmp"); ### This calls the function we defined, above.
for (i=1;i<=NR;i++) { ### Step through the arrays and reassemble.
printf("%s %s\n",lhs[i],sorted[i]);
}
}
[ghoti@pc ~/tmp3]$ gawk -f doit.gawk text
1 a f 2 10 w
2 b g 5 11 z
3 c h 1 12 v
4 d i 4 15 y
5 e j 3 19 x
[ghoti@pc ~/tmp3]$
これにより、入力ファイル全体が配列に保持されるため、並べ替え後に行を再アセンブルできます。入力が数百万行の場合、これは問題になる可能性があります。
printf
および関数を試して、sprintf
適切な出力フィールドセパレータを設定することをお勧めします。
関数での使用に関するドキュメントasort()
は、gawkのmanページにあります。を探しますPROCINFO["sorted_in"]
。