Хоча я б не рекомендував це (зважаючи на відносну простоту передачі результату за допомогою зовнішньої sort
команди), ви можете це зробити принаймні з останніми версіями GNU awk (принаймні 4,0 IIRC), як описано в сортуванні значень масиву та індексів з gawk
Ось як ви могли це реалізувати, якщо припустити, що у вас є дані в асоціативному масиві, в якому знаходиться індекс 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"]
криптовалютне значення, потім вивести масив. Я б не поїхав туди.