如何让sort命令提前执行输出,实现awk脚本排序后追加内容?
解决awk中sort管道输出顺序及排序数据存数组的问题
问题根源
你当前的代码里,awk会把所有通过管道传给sort的数据缓冲起来,直到整个脚本执行完毕才关闭管道,这时候sort才会输出排序结果——所以你的页脚会先打印,sort的输出反而在后面。要解决这个问题,核心是主动关闭sort管道的写入端,让sort立刻处理数据并输出,同时还能读取排序后的结果存入数组。
方案1:先输出排序结果,再打印页脚(不存数组)
如果只需要先输出排序内容再打印页脚,不需要存数组,只需在写完所有要排序的数据后关闭sort管道即可:
# 循环输出要排序的内容到sort管道 for (y in working_employee_id) { printf(" %-25s %-20s %d\n", employee_name[working_employee_id[y]], title[employee_name[working_employee_id[y]]], salary[employee_name[working_employee_id[y]]]) | "sort -nr -k2" } # 关闭sort管道,触发sort立即处理并输出结果 close("sort -nr -k2") # 现在可以打印页脚或其他内容 print "------------------------" print "员工薪资统计完毕"
方案2:将排序后的数据存入数组,灵活使用
如果需要把排序后的内容存入数组,后续做其他打印或处理,需要通过getline读取sort的输出:
# 定义sort命令变量,方便复用 sort_cmd = "sort -nr -k2" # 第一步:把所有要排序的内容写入sort管道 for (y in working_employee_id) { printf(" %-25s %-20s %d\n", employee_name[working_employee_id[y]], title[employee_name[working_employee_id[y]]], salary[employee_name[working_employee_id[y]]]) | sort_cmd } # 关闭管道的写入端,让sort开始处理数据 close(sort_cmd, "to") # 第二步:读取sort的输出,存入sorted数组,同时可以直接打印 sorted_count = 0 while ((sort_cmd | getline sorted_line) > 0) { sorted[++sorted_count] = sorted_line print sorted_line # 实时打印排序结果 } # 关闭管道的读取端 close(sort_cmd) # 第三步:使用sorted数组做后续操作,比如打印页脚、二次处理 print "\n========================" print "薪资最高的前3名员工:" for (i=1; i<=3 && i<=sorted_count; i++) { print sorted[i] } print "========================"
关键说明
close(cmd, "to"):明确关闭管道的写入方向,告诉sort没有更多数据了,sort会立刻执行排序并输出。部分awk版本可能只需要close(cmd),但指定方向兼容性更好。getline:从sort管道读取每一行排序后的结果,存入数组的同时可以直接打印,保证输出顺序符合预期。- 数组
sorted里存储了所有排序后的行,后续可以任意提取、处理或重新打印。
内容的提问来源于stack exchange,提问作者Yash Saini
相关产品推荐
相关产品推荐

