【问题标题】:Count value in column by hours and add header按小时计算列中的值并添加标题
【发布时间】:2018-11-28 23:33:36
【问题描述】:

在第 3 列中,值是小时,我想打印从 0 到 23 小时的标题,并在第 3 列中计算小时重复的次数。如果没有找到 hr 的值,则打印 0。

输入文件

123 3 3
122 3 3
122 4 4
122 3 4
122 4 4
122 5 5
122 3 12
122 4 15
122 5 20
122 5 20

所需的输出

第一行 = 标题 0 到 23 小时,以,

第二行 = 为每个小时找到的值。如果没有找到值,则打印 0。

0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23
0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0

按小时计算,我试过了

awk '{a[$3]++} END {for(i in a) print i, a[i]}'

提前致谢。

【问题讨论】:

    标签: awk


    【解决方案1】:

    另一个awk

    $ awk '{a[$3]++} 
        END{while(i<24) 
              {h1=h1 s i+0; 
               h2=h2 s a[i++]+0; 
               s=","} 
            print h1 ORS h2}' file
    
    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
    0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0
    

    ps。看起来像是@JamesBrown 答案的变体。

    【讨论】:

    • 很高兴s="," 在循环中。为什么我从来没想过。此外,不是变化,而是改进。 ++
    • 是的,惰性分隔符初始化;处理第一个元素的情况比检查更简单。
    • 除了实现细节之外,主要思想是在一个循环中设置两条线。
    • Karakfa,是否有可能始终保持 2 挖掘标题。例如。 00 代替 0,01 代替 1 等等。
    • h1=h1 s i+0 更改为 h1=h1 s sprintf(%02d",i) 以获取零填充数字。
    【解决方案2】:
    $ awk '
    { a[$3]++ }                              # hash them
    END {
        for(i=0;i<=23;i++) {                 # loop the hours
            b=b (b==""?"":",") i             # collect hours to b
            c=c (c==""?"":",") (a[i]?a[i]:0) # and counts to c
        }
        print b ORS c                        # output them
    }' file
    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
    0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0
    

    【讨论】:

      【解决方案3】:

      请您尝试关注一下。

      awk '
      BEGIN{
        OFS=","
        for(i=0;i<=23;i++){
           printf("%d%s",i,i==23?ORS:OFS)
        }
      }
      {
        a[$3]++
      }
      END{
        for(j=0;j<=23;j++){
           printf("%d%s",a[j],j==23?ORS:OFS)
        }
      }'   Input_file
      

      输出如下。

      0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
      0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0
      

      【讨论】:

        【解决方案4】:

        稍微改变for循环:

        for(i in a) print i, a[i]
        

        收件人:

        for(i=0; i<=23; i++) print i, a[i]+0
        

        rs转置输出:

        awk ... | rs -c' ' -T
        

        输出:

        0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23
        0   0   0   2   3   1   0   0   0   0   0   0   1   0   0   1   0   0   0   0   2   0   0   0
        

        如果您确定 csv 输出,请在末尾使用 tr

        awk '{a[$3]++} END {for(i=0;i<=23;i++) print i, a[i]+0}' | rs -c' ' -T | tr -s ' ' ,
        

        输出:

        0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
        0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0
        

        【讨论】:

        • 必须 rs .
        • 顺便说一句。 datamash 也可以,例如在这种情况下:datamash -t ' ' transpose
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        • 2020-04-20
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多