AWK按字符串长度排序字符串数组

时间:2016-01-18 09:21:23

标签: arrays sorting awk gawk

该数组是从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 ..”尝试过它。但我所取得的成就是按字母顺序排序。

3 个答案:

答案 0 :(得分:0)

awk的{p> 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)

使用sort decorate / undecorate

可能更容易
$ 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