有一点背景知识:我从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}}'
虽然我确定你知道我在做什么,但我会打破思维过程。
示例输入:
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
障碍将是:
如果有更好的方法可以做到这一点,我愿意接受建议。我觉得这是一个挑战,但想到它会有所帮助,因为我不是一个awk专家。提前谢谢。
答案 0 :(得分:1)
您可以将其用作提取字段的起始形式:
awk -v FIELDWIDTHS='3 10 6 3 18 11 148 4 8' -v OFS='|' \
'{ for (i = 1; i <= NF; ++i) sub(/[ \t]*$/, "", $i) } 1' file
输出:
J|553386752|+--Q|+|vm1868|utsl099|||
J|553386804|+--Q|+|vm1868|utsl099|||
J|553386815|+--Q|+|vm1868|utsl099|||
J|553386851|+--Q|+|vm1868|utsl099|||
J|553386895|+--Q|+|vm1868|utsl099|||
J|553386931|+--Q|+|vm1868|utsl099|||
J|553386932|+--Q|+|vm1868|utsl099|||
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|||
J|553433996|+--Q|+|vm1479|usln099|||
J|553433997|+--Q|+|vm1479|usln099|||
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||
在具有对齐列的输入上:
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
此代码:
awk -v FIELDWIDTHS='3 10 6 3 18 11 173 4 8' -v OFS='\t' \
'{ for (i = 1; i <= NF; ++i) sub(/[ \t]*$/, "", $i) }
$4 == "+" { a[$5] += $8; b[$5] = $6; c[$5] = $7 }
END { for (i in a) { print " " a[i], b[i], i, c[i]} }' file
可生产
20 ubrm099 vm1479 ${JMS_CLIENT_ID}.admin.vm1433.2014-08-12T15:32:26.743Z
25 utsl099 vm1868