Bash AWK:打印列、列和(&;可能缺少列
了解一点背景:我有来自jms ems管理工具的输出,报告到jms队列的连接。我目前筛选出第5、第6和NF-1列(需要第7列,因为第7列并不总是存在),并根据第5列对NF-1列求和,使用以下语句:Bash AWK:打印列、列和(&;可能缺少列,bash,awk,printing,Bash,Awk,Printing,了解一点背景:我有来自jms ems管理工具的输出,报告到jms队列的连接。我目前筛选出第5、第6和NF-1列(需要第7列,因为第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}}' 虽然我相信你知道我在做什么,但我会
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
我希望输出的内容:
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
看起来像:
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专家。提前感谢您。您可以将此作为提取字段的起始表单:
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 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
让我试着使用固定宽度,看看效果如何。谢谢你的想法!使用:
|awk-v FIELDWIDTHS='3 10 6 3 18 11 173 4 8'-v OFS='|'{for(i=1;i@krmarshall87我注意到第8行和第12行中的最后两列与其他行中的最后两列不对齐。即使在原始文件中也是这样吗?$4=“+”
可能应该是$4==“+”
。请检查简化的代码。当我开始根据队列名称将其应用于数千行时,发现列的宽度是动态的,基于提供的最宽值,因此非常可变。是否还有类似$7==$NF-3、打印$7这样的情况?