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:谢谢。我正在编写的脚本有两个,因此剩下了两个。