我一直在尝试在2D printf之后进行打印,但是我放置在数组之后的打印发生在2D数组打印之前。

这是有问题的代码(在awk脚本中):

(in main block) if(tot >= 500) { totEligible++ eligibles[totEligible,1] = $1 eligibles[totEligible,2] = $2 } (in end block) { # print out all the eligible contributors' information for(i = 1; i <= totEligible; i++) { printf("\t%s--%s\n", eligibles[i,1], eligibles[i,2]) | "sort -k2" if (i == totEligible -1){ printf "\t\tThanks for all your continued support!!!" } }}


输出显示如下:
Thanks for all your continued support!!! John Goldenrod--(916) 348-4278 Mike Harrington--(510) 548-1278 Archie McNichol--(206) 548-1348 Guy Quigley--(916) 343-6410 Dan Savage--(406) 298-7744 Tom Savage--(408) 926-3456 Elizabeth Stachelin--(916) 440-1763

它应该显示在Elizabeth Stachelin线下方,但它没有这样做。知道可能是什么问题吗?提前致谢。

最佳答案

您需要在打印谢谢之前用close("sort -k2")关闭外壳管道。看:

$ awk 'BEGIN{print "b" ORS "a" | "sort"; print "Done!"}'
Done!
a
b

$ awk 'BEGIN{print "b" ORS "a" | "sort"; close("sort"); print "Done!"}'
a
b
Done!


在您的脚本中,“排序”只是在等待更多输入,直到脚本结束(在您感谢打印之后),然后关闭管道进行排序并输出该排序的结果。

最佳做法是将shell命令存储在变量中,这样就可以保证对要传递给的完全相同的字符串执行close()

$ awk 'BEGIN{cmd="sort"; print "b" ORS "a" | cmd; close(cmd); print "Done!"}'
a
b
Done!


否则,您可能试图关闭不存在的管道,而awk会乐于执行任何操作。

10-07 19:38
查看更多