【发布时间】:2020-11-12 15:27:06
【问题描述】:
假设我有一个简单的小字符串文件,我想按行长排序:
$ cat file1
123
2
45
12345
123456789
1
我可以编写一个gawk 脚本,使用函数和PROCINFO["sorted_in"] 对这些字符串进行排序:
$ 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
}
' file1
1
2
45
123
12345
123456789
完美!
但现在假设我在该文件中添加了一些更长的字符串:
$ 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 在此示例中不能使用较长的字符串吗?
【问题讨论】:
-
除此之外 - 您只有一个输入文件,因此
NR==FNR始终为真,因此可以删除。 -
@EdMorton:谢谢。我正在编写的脚本有两个,因此剩下了。