【问题标题】:AWK: print columns, sum of column, & possible missing columnAWK:打印列、列总和和可能缺少的列
【发布时间】: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}}'

虽然我确定你知道我在做什么,但我会分解思考过程。

  1. 输入从源输入并通过管道输入
  2. 检查第 4 个字段是否为加号并打印我想要的字段(主要用于分工,我可以在第 3 步测试输入
  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

障碍将是:

  1. 如果 $7 == $NF-3,则间歇性字段确实存在并应打印
  2. 根据可能存在的字段 AND $5 求和

如果有更好的方法可以做到这一点,我愿意接受建议。我觉得这是一个挑战,但认为更多的想法会有所帮助,因为我不是 awk 专家。提前谢谢你。

【问题讨论】:

    标签: bash awk printing


    【解决方案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
    

    【讨论】:

    • 让我尝试使用固定宽度,看看效果如何。感谢您的想法!
    • 使用:|awk -v FIELDWIDTHS='3 10 6 3 18 11 173 4 8' -v OFS='|' '{for (i = 1; i &lt;= NF; ++i) sub(/[ \t]*$/, "", $i) } 1'|awk -F'|' '$4 = "+" {print $5, $8, $6, $7}'|awk '{a[$1]+=$2;b[$1]=$3;c[$1]=$4}END{for (i in a){print " "a[i]"\t",b[i]"\t"i"\t"c[i]}}' 谢谢!
    • @krmarshall87 我注意到第 8 行和第 12 行中的最后 2 列与其他行中的其他最后 2 列不对齐。即使在您的原始文件中,它们也真的如此吗?
    • $4 = "+" 可能应该是$4 == "+"。请检查简化代码。
    • 当我开始根据队列名称将其应用于数千行时,发现列的宽度是动态的,基于提供的最宽值,因此非常可变。有没有像 $7 == $NF-3, print $7 这样的东西?
    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2016-09-18
    • 2023-02-04
    • 2017-04-18
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多