AWK:打印列,列总和,&可能缺少的专栏

时间:2014-08-15 13:26:46

标签: bash awk printing

有一点背景知识:我从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}}'

虽然我确定你知道我在做什么,但我会打破思维过程。

  1. 输入从源输入并通过管道输入
  2. 检查第4个字段是加号并打印我想要的字段(主要用于分工,我可以在第3步测试输入
  3. 基于第1列(原始第5个字段)汇总第2列(原始NF-1)并打印其余部分
  4. 示例输入:

    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
    

    障碍将是:

    1. 如果$ 7 == $ NF-3,则间歇性字段存在且应该打印
    2. SUM基于可能存在的字段AND $ 5
    3. 如果有更好的方法可以做到这一点,我愿意接受建议。我觉得这是一个挑战,但想到它会有所帮助,因为我不是一个awk专家。提前谢谢。

1 个答案:

答案 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