Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays AWK按字符串长度对字符串数组进行排序_Arrays_Sorting_Awk_Gawk - Fatal编程技术网

Arrays AWK按字符串长度对字符串数组进行排序

Arrays AWK按字符串长度对字符串数组进行排序,arrays,sorting,awk,gawk,Arrays,Sorting,Awk,Gawk,数组是从split()获取的x=split(A,B)。 我需要根据字符串的长度对数组进行排序,从最小到最大 当前订单: B[1]=alnis; B[2]=nis; B[3]=connis 所需订单: B[1]=nis; B[2]=alnis; B[3]=connis 我用gawk,procinfo[“排序在”]=“@whatever…”试过了。但是我最擅长的是按字母顺序排序。awk的asort()支持定制的比较函数,因此您可以定义如何对数组排序 您需要一个自定义的“比较”函数,并使用此比较函

数组是从split()获取的x=split(A,B)。 我需要根据字符串的长度对数组进行排序,从最小到最大

当前订单:

B[1]=alnis;
B[2]=nis;
B[3]=connis
所需订单:

B[1]=nis;
B[2]=alnis;
B[3]=connis
我用gawk,procinfo[“排序在”]=“@whatever…”试过了。但是我最擅长的是按字母顺序排序。

awk的asort()
支持定制的比较函数,因此您可以定义如何对数组排序

您需要一个自定义的“比较”函数,并使用此比较函数执行
asort()

例如:

kent$f类
阿尼斯康尼斯酒店
kent$awk'函数的长度(i1,v1,i2,v2){返回长度(v1)-长度(v2)}
awk的{x=split($0,a);asort(a,b,“byLength”);for(i=1;i
asort()
支持自定义的比较函数,因此您可以定义排序数组的方式

您需要一个自定义的“比较”函数,并使用此比较函数执行
asort()

例如:

kent$f类
阿尼斯康尼斯酒店
kent$awk'函数的长度(i1,v1,i2,v2){返回长度(v1)-长度(v2)}

{x=split($0,a);asort(a,b,“byLength”);for(i=1;i您可以像这样控制数组遍历的顺序:

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)
循环遍历数组元素的顺序。要以新顺序遍历结果,需要使用“C样式”循环或更改
PROCINFO[“sorted_in”]
如上所述。

您可以像这样控制数组遍历的顺序:

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)
循环遍历数组元素的顺序。要以新顺序遍历结果,需要使用“C样式”循环或更改
PROCINFO[“sorted_in”]
如上所述。

排序装饰/取消装饰可能更容易

$ 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

通过分类装饰/取消装饰可能更容易

$ 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