Arrays AWK按字符串长度对字符串数组进行排序
数组是从split()获取的x=split(A,B)。 我需要根据字符串的长度对数组进行排序,从最小到最大 当前订单: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()支持定制的比较函数,因此您可以定义如何对数组排序 您需要一个自定义的“比较”函数,并使用此比较函
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;iasort()
支持自定义的比较函数,因此您可以定义排序数组的方式
您需要一个自定义的“比较”函数,并使用此比较函数执行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