awk 脚本管道改变明显的执行顺序
Awk script piping changes apparent execution order
以下是我的脚本片段:
END{
for (key in data) {
print key" "data[key]|"sort -k 2n";
}
print "something or other"
}
问题是,控制台输出首先显示第二个打印输出,然后显示在 for 循环中通过 sort 管道传输的打印输出的结果。
粗暴地戴牙套都无济于事。
我什至不知道如何 google 关于这个问题,排序如何收集它应该排序的内容?我怎样才能更好地引导它?
编辑:刚刚意识到,问题不在于它捕捉到最后一次打印,而是它实际上在最后一次打印之后执行,尽管它被调用得更早。
答案是 Ed Morton 建议的 close() 函数。
有关 close() 的详细信息,我发现 https://www.gnu.org/software/gawk/manual/html_node/Close-Files-And-Pipes.html 很有用。
正确的代码段因此变成:
END{
for (key in data) {
print key" "data[key]|"sort -k 2n";
}
close("sort -k 2n");
print "something or other";
}
这样,它正确地打印出 for 循环的排序输出,并且仅在此之后打印出循环后调用的最后一个打印输出。
以下是我的脚本片段:
END{
for (key in data) {
print key" "data[key]|"sort -k 2n";
}
print "something or other"
}
问题是,控制台输出首先显示第二个打印输出,然后显示在 for 循环中通过 sort 管道传输的打印输出的结果。
粗暴地戴牙套都无济于事。 我什至不知道如何 google 关于这个问题,排序如何收集它应该排序的内容?我怎样才能更好地引导它?
编辑:刚刚意识到,问题不在于它捕捉到最后一次打印,而是它实际上在最后一次打印之后执行,尽管它被调用得更早。
答案是 Ed Morton 建议的 close() 函数。
有关 close() 的详细信息,我发现 https://www.gnu.org/software/gawk/manual/html_node/Close-Files-And-Pipes.html 很有用。
正确的代码段因此变成:
END{
for (key in data) {
print key" "data[key]|"sort -k 2n";
}
close("sort -k 2n");
print "something or other";
}
这样,它正确地打印出 for 循环的排序输出,并且仅在此之后打印出循环后调用的最后一个打印输出。