该数组是从split()获得的;的 X =分裂(A,B)即可。 我需要按字符串的长度对数组进行排序,从最小到最大。
当前订单:
B[1]=alnis;
B[2]=nis;
B[3]=connis
所需订单:
B[1]=nis;
B[2]=alnis;
B[3]=connis
我用gawk,procinfo [“sorted in”] =“@ whatever ..”尝试过它。但我所取得的成就是按字母顺序排序。
答案 0 :(得分:0)
asort()
支持自定义比较功能,因此您可以定义如何对数组进行排序。
您需要自定义的“比较”功能,并使用此比较功能执行asort()
。
E.g:
kent$ cat f
alnis nis connis
kent$ awk ' function byLength(i1,v1,i2,v2){ return length(v1)-length(v2)}
{x=split($0, a);asort(a,b,"byLength");for(i=1;i<=x;i++)print b[i]}' f
nis
alnis
connis
答案 1 :(得分:0)
您可以像这样控制数组遍历的顺序:
function cmp_len(i1, v1, i2, v2) {
return length(v1) - length(v2)
}
BEGIN {
b[1] = "alnis"
b[2] = "nis"
b[3] = "connis"
PROCINFO["sorted_in"] = "cmp_len"
for (i in b) {
print b[i]
}
}
我创建了自己的比较函数,并将其名称分配给PROCINFO["sorted_in"]
,以改变遍历元素的顺序。
测试出来:
$ awk -f script.awk
nis
alnis
connis
您还可以将此函数的名称作为第三个参数传递给asort
,以便将已排序的值写入新数组:
asort(b, sorted, "cmp_len")
请注意,这会更改数组元素的索引,但不将使用for (i in sorted)
循环遍历它们的顺序。要在新订单中循环结果,您需要使用&#34; C风格&#34;如上所述循环或更改PROCINFO["sorted_in"]
。
答案 2 :(得分:0)
$ echo -e "alnis\nnis\nconnis" |
while read -r a; do echo -e ${#a}'\t'$a; done |
sort -n | cut -f2
nis
alnis
connis
或类似于awk
$ echo -e "alnis\nnis\nconnis" |
awk '{print length($0)"\t"$0}' |
sort -n | cut -f2