找到每个JOBID(AWK)的最后一行

时间:2017-01-31 07:44:03

标签: awk

你能帮我解决这个问题吗? 第一个字段代表一个JOBID,我需要获取单个JOBID的最后处理计数,所以我尝试制作AWK脚本,这样做只显示最后一个JOBID的最后一个数据。 如何使用AWK获取每个JOBID的最后数据?

@输入数据

259/logs/progress.log:2017-01-31 13:54:02/PROCESSED_COUNT/0
259/logs/progress.log:2017-01-31 13:55:12/PROCESSED_COUNT/4881000
259/logs/progress.log:2017-01-31 13:55:15/PROCESSED_COUNT/5000000
260/logs/progress.log:2017-01-31 13:54:43/PROCESSED_COUNT/0
258/logs/progress.log:2017-01-31 13:54:02/PROCESSED_COUNT/0
258/logs/progress.log:2017-01-31 13:54:12/PROCESSED_COUNT/1018216
258/logs/progress.log:2017-01-31 13:54:22/PROCESSED_COUNT/2045037
260/logs/progress.log:2017-01-31 13:54:53/PROCESSED_COUNT/343000
260/logs/progress.log:2017-01-31 13:55:03/PROCESSED_COUNT/751997
260/logs/progress.log:2017-01-31 13:56:43/PROCESSED_COUNT/4814880
260/logs/progress.log:2017-01-31 13:56:49/PROCESSED_COUNT/4999996

@ AWK

awk '/PROCESSED_COUNT/ {a=$0} END{if (a!="") print a}'  test 

@输出

260/logs/progress.log:2017-01-31 13:56:49/PROCESSED_COUNT/4999996

@ Desired Output

259/logs/progress.log:2017-01-31 13:55:15/PROCESSED_COUNT/5000000
258/logs/progress.log:2017-01-31 13:54:22/PROCESSED_COUNT/2045037
260/logs/progress.log:2017-01-31 13:56:49/PROCESSED_COUNT/4999996

2 个答案:

答案 0 :(得分:1)

您可以在扫描文件时存储条目并在结尾打印:

awk -F/ '{a[$1]=$0}END{for(i in a){print a[i]}}' a.txt

一件事:这不会保留每个id的最后一次出现的顺序。

答案 1 :(得分:0)

@Sigularity:hek2mgl的解决方案非常好并且运行正常,只有它可能不会按照Input_file中的作业ID的顺序给出结果,如果你需要与JOB ID相同的顺序在Input_file中那么你可以尝试跟着它。

awk -F"/" 'FNR==NR{A[$1]=$0;next} ($1 in A){print A[$1];delete A[$1]}'  Input_file  Input_file

我在这里将字段分隔符设为“/”。 检查条件FNR == NR(将确保仅在读取第一个Input_file时才运行进程命令。) 创建一个名为A的数组,其索引为$ 1,并在此处提及,这将确保不再执行任何语句。 现在放入($ 1 in A){只有在第二次读取Input_file时才会执行。} 它检查当前行的第一个字段是否存在于数组A中然后打印A [$ 1]并删除A [$ 1](以避免重复数组A的值)。