Sorting gawk和PROCINFO无法按预期对较长字符串进行排序

Sorting gawk和PROCINFO无法按预期对较长字符串进行排序,sorting,awk,Sorting,Awk,假设我有一个简单的字符串小文件,我想按行长度排序: $ cat file1 123 2 45 12345 123456789 1 我可以编写一个gawk脚本,使用函数和PROCINFO[“sorted_in”]对这些字符串进行排序: 太好了 但现在假设我在该文件中添加了一些更长的字符串: $ cat file2 123 2 45 xyxyxyxyxyyxyxyxyxyxyyxyxyxxyxyxyxyyxyxyxyxyyx 12345 565656565656565656656565665656

假设我有一个简单的字符串小文件,我想按行长度排序:

$ cat file1
123
2
45
12345
123456789
1
我可以编写一个
gawk
脚本,使用函数和
PROCINFO[“sorted_in”]
对这些字符串进行排序:

太好了

但现在假设我在该文件中添加了一些更长的字符串:

$ cat file2
123
2
45
xyxyxyxyxyyxyxyxyxyxyyxyxyxxyxyxyxyyxyxyxyxyyx
12345
56565656565656565665656566565656656565656
123456789
1
它打破了:

$ gawk 'function cmp_len(i1, v1, i2, v2) {
            return length(v1) - length(v2)
      }
      NR==FNR{arr[$0]; next}
      END{PROCINFO["sorted_in"] = "cmp_len"
      for (e in arr) print e
      } 
      ' file2
123456789
56565656565656565665656566565656656565656
1
2
45
123
12345
xyxyxyxyxyyxyxyxyxyxyyxyxyxxyxyxyxyyxyxyxyxyyx
它确实以这种方式正常工作:

$ awk '{ print length()"\t"$0}' file2 | sort -n | cut -f2
# expected output by length...
但这使得我正在写的剧本更加困难

您知道为什么在本例中,
PROCINFO
不能处理较长的字符串吗?

来自:

这里,“i1”和“i2”是指数,“v1”和“v2”是被比较的两个元素的对应值

比较函数是比较数组的值,而不是索引。值总是空字符串,因此函数总是返回0。换成

function cmp_len(i1, v1, i2, v2) {
         return length(i1) - length(i2)
}            
你会得到你想要的订单。或者更好的是,缓存长度并使用内置的比较,因为现在存储了有意义的值:

gawk'
NR==FNR{arr[$0]=length($0)}
结束{
PROCINFO[“排序在”]=“@val\u num\u asc”
对于(arr中的e)打印e
} 
'文件1
来自:

这里,“i1”和“i2”是指数,“v1”和“v2”是被比较的两个元素的对应值

比较函数是比较数组的值,而不是索引。值总是空字符串,因此函数总是返回0。换成

function cmp_len(i1, v1, i2, v2) {
         return length(i1) - length(i2)
}            
你会得到你想要的订单。或者更好的是,缓存长度并使用内置的比较,因为现在存储了有意义的值:

gawk'
NR==FNR{arr[$0]=length($0)}
结束{
PROCINFO[“排序在”]=“@val\u num\u asc”
对于(arr中的e)打印e
} 
'文件1

所以第一个示例输出只是随机优度?因为所有条目相互比较相等,是的,很有可能是这样。所以第一个示例输出只是随机优度?因为所有条目相互比较相等,是的,只是碰巧它是那样的。放在一边-你只有一个输入文件,所以
NR==FNR
总是正确的,所以可以删除。@EdMorton:谢谢。我正在编写的脚本有两个,因此剩下了。放在一边-您只有一个输入文件,因此
NR==FNR
始终为真,因此可以删除。@EdMorton:谢谢。我正在编写的脚本有两个,因此剩下了两个。