gawkを使用した配列値とインデックスの並べ替えでsort
説明されているように、(外部コマンドを介して結果をパイプする比較的単純な方法で)推奨しませんが、少なくとも最近のバージョンのGNU awk(少なくとも4.0 IIRC)でこれを実行できます。
インデックスがである連想配列にデータがあると仮定して、それを実装する方法を次に示しますFirstname Lastname
。最初にLastname
、Firstname
たとえば、インデックスを分割し、次に(タイブレーカーとして)最初に比較するカスタム比較関数を定義する必要があります。
function mycmp(ia, va, ib, vb, sa, sb) {
if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
if(sa[2] < sb[2]) return -1;
else if (sa[2] > sb[2]) return 1;
else {
# compare first names
if(sa[1] < sb[1]) return -1;
else if (sa[1] > sb[1]) return 1;
else return 0;
}
}
else return 0;
}
これでPROCINFO["sorted_in"]
、@ zwetsのコメントに記載されている配列の並べ替え方法を使用できます
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
それを一緒に入れて
#!/usr/bin/gawk -f
function mycmp(ia, va, ib, vb, sa, sb) {
if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
if(sa[2] < sb[2]) return -1;
else if (sa[2] > sb[2]) return 1;
else {
# compare first names
if(sa[1] < sb[1]) return -1;
else if (sa[1] > sb[1]) return 1;
else return 0;
}
}
else return 0;
}
{
a[$1" "$2] = $3;
}
END {
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
}
テスト:
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
awkの古いバージョンまたは古いバージョンでは、インデックス付けされたデータをLastname Firstname
代わりに格納し、従来asorti
のでソートしてから、配列を走査してそれを出力するときに、インデックスのフィールドを分割および交換することが最善の策です。
awk '
{a[$2" "$1]=$3}
END {
n=asorti(a,b); for (i=1;i<=n;i++) {split(b[i],s); print s[2], s[1], a[b[i]]}
}' yourfile
x
PROCINFO["sorted_in"]