尽管我不建议这样做(考虑到通过外部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"]
为一个隐含值,然后输出数组。我不会去那里。