แม้ว่าฉันจะไม่แนะนำ (เนื่องจากความเรียบง่ายสัมพัทธ์ของการไพพ์ผลลัพธ์ผ่านsort
คำสั่งภายนอก) คุณสามารถทำได้อย่างน้อยด้วย GNU awk รุ่นล่าสุด (อย่างน้อย 4.0 IIRC) ตามที่อธิบายไว้ในSorting Array Values and Indices with 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"]
เป็นความลับ จากนั้นออกอาร์เรย์ ฉันจะไม่ไปที่นั่น