【发布时间】:2014-08-15 13:26:45
【问题描述】:
了解一点背景知识:我有来自 jms ems 管理工具的输出,报告了与 JMS 队列的连接。我目前过滤掉第 5、第 6 和 NF-1 列(因为第 7 列并不总是存在而需要),并使用以下语句根据第 5 列对 NF-1 列求和:
echo $input|awk '$4 = "+" {print $5, $(NF-1), $6}'|awk '{a[$1]+=$2;b[$1]=$3}END{for (i in a){print " "a[i]"\t",b[i]"\t"i}}'
虽然我确定你知道我在做什么,但我会分解思考过程。
- 输入从源输入并通过管道输入
- 检查第 4 个字段是否为加号并打印我想要的字段(主要用于分工,我可以在第 3 步测试输入
- 根据第 1 列(原始第 5 字段)对第 2 列(原始 NF-1)求和并打印其余部分
输入示例:
J 553386752 +--Q + vm1868 utsl099 1 10:39:47
J 553386804 +--Q + vm1868 utsl099 4 10:39:44
J 553386815 +--Q + vm1868 utsl099 4 10:39:47
J 553386851 +--Q + vm1868 utsl099 4 10:39:47
J 553386895 +--Q + vm1868 utsl099 4 10:39:41
J 553386931 +--Q + vm1868 utsl099 4 10:39:47
J 553386932 +--Q + vm1868 utsl099 4 10:39:47
J 553391311 +--T - vm1657 ueai099 cn=ubai090,ou=domain,o=bn,udi=bai-event-mover-3_0-vm165d-prod 1 10:39:44
J 553433995 +--Q + vm1479 usln099 5 10:39:50
J 553433996 +--Q + vm1479 usln099 5 10:39:50
J 553433997 +--Q + vm1479 usln099 5 10:39:50
J 553435753 +--Q + vm1479 ubrm099 some-other-program-name-1_0-prod-vm1454-2014-08-12T15:31:59.541Z.vm1454 4 10:39:44
J 553435927 +--T + vm1479 ubrm099 ${JMS_CLIENT_ID}.admin.vm1433.2014-08-12T15:32:26.743Z 1 10:39:50
我想要的输出:
[sum of NF-1 based upon the uniqueness of $5 AND $7 (if it exists)] [$6] [$5] [$7]
看起来像:
# user server program (clientID)
25 utsl099 vm1868
15 usln099 vm1479
4 ubrm099 vm1479 some-other-program-name-1_0-prod-vm1454
1 ubrm099 vm1479 ${JMS_CLIENT_ID}.admin.vm1433
障碍将是:
- 如果 $7 == $NF-3,则间歇性字段确实存在并应打印
- 根据可能存在的字段 AND $5 求和
如果有更好的方法可以做到这一点,我愿意接受建议。我觉得这是一个挑战,但认为更多的想法会有所帮助,因为我不是 awk 专家。提前谢谢你。
【问题讨论】: