Meskipun saya tidak akan merekomendasikannya (mengingat kesederhanaan relatif dari memipipkan hasilnya melalui sort
perintah eksternal ) Anda dapat melakukan ini setidaknya dengan versi terbaru dari GNU awk (minimal 4.0 IIRC), seperti yang dijelaskan pada Sorting Array Values and Indices with gawk
Inilah cara Anda dapat mengimplementasikannya, dengan asumsi Anda memiliki data dalam array asosiatif di mana indeks berada Firstname Lastname
. Pertama, Anda perlu mendefinisikan fungsi perbandingan khusus yang membagi indeks, membandingkan pertama Lastname
lalu (sebagai tie breaker) pada Firstname
misalnya
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;
}
Sekarang Anda dapat menggunakan PROCINFO["sorted_in"]
metode pengurutan array yang disebutkan dalam komentar oleh @zwets
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
Menyatukannya
#!/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];
}
Pengujian:
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
Dalam versi awk yang lebih kecil atau lebih lama, taruhan terbaik Anda mungkin adalah menyimpan data yang diindeks dengan Lastname Firstname
, mengurutkan dengan yang konvensional asorti
, lalu membagi dan menukar bidang indeks saat Anda melintasi array untuk mencetaknya:
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
, lalu setelPROCINFO["sorted_in"]
ke nilai samar, kemudian output array. Saya tidak akan pergi ke sana.