যদিও আমি এটির সুপারিশ করব না (বাহ্যিক sort
কমান্ডের মাধ্যমে ফলাফলটি পাইপ করার ক্ষেত্রে আপেক্ষিক সরলতা দেওয়া হয়েছে ) আপনি অন্তত জিএনইউ অ্যাজকের সাম্প্রতিক সংস্করণ (কমপক্ষে 4.0 আইআইআরসি) দিয়ে এটি করতে পারেন, যেমন গাকের সাথে অ্যারে মানগুলি এবং সূচকগুলি বাছাইকরণে বর্ণিত হয়েছে
অনুগ্রহপূর্বক কোনও মিশুক অ্যারেতে আপনার কাছে ডেটা আছে তা ধরে নিয়ে আপনি কীভাবে এটি প্রয়োগ করতে পারেন তা এখানে 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
অজকের কম বা পুরানো সংস্করণগুলিতে, আপনার সেরা বাজি হতে পারে 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"]
একটি ক্রিপ্টিক মানতে সেট করা হবে, তারপরে অ্যারে আউটপুট করুন। আমি সেখানে যাব না।