【问题标题】:awk command to count two fields using for loopsawk 命令使用 for 循环计算两个字段
【发布时间】:2015-02-18 04:45:32
【问题描述】:

我有以下文件,我需要创建一个 awk 命令来计算字段 $15(错误代码)在每个字段 $2(事件键)中出现的次数。 比如:

Video_load_time,错误代码:111,出现次数:2

Video_load_time,错误代码:3805,出现次数:3

app_launch_time, errcode: 111, 出现次数: 1

time|eventKey|Version|Model|SVersion|signal|net|State|atitude|long|subd|bupUsername|tvAccount|assetId|errorCode|errorDescription|duration

14201|video_load_time|5.7|i3|8.3|0.0|FI|GT|52.1147619|9829672936714|777|ghouso|444|6789|111|4464|7149       
4399784|playback_error|8.0|W8|33.2|0.0|FI|TED|468|071|078410X_.ca||2314831||3805|152rorDescript|0      
762|playback_error|70|ALFiee|4.2.2|0.0|IFI|AUED|4325|795|||81321761|3805|05|1529|
634|app_launch_time|5.0.0|SGHI317M|4.1.2|0.0|CELAR|AUTO_ATED|4588|64|180||||3805|yes|0     
1418|video_load_time|5.0.0.37|iP1|7.0.6|0.0|IN_HE_WIFI|AUTHEATED|45.47099941453838|477109099|||8455700500884828|111|N/A|77|9398     
1420|playback_error|5.0.0.37|iPa1|8.1.1|0.0|WIFI|BUP|9863786|6799798072||ta99|841759656|Be000|1601|Video|22
594|app_launch_time|5.0.0|S7M|4.3|0.0|CLAR|AUTO_ATED|5010226|-110.673567|6167612959947-023Xca|||111|N/A||11
421|video_load_time|5.0.0.37|iP5|8.1.2|0.0|WIFI|BUP|528950658168|06.613394189||cpcpb15|84551050401|1601|N/A||182

所以我创建了以下代码:

awk -F \| '{ duration[$15] = $NF; ++counter[$15]; duration2[$2] = $NF; } END {for(d in duration); for(e in duration2) {print e,d, counter[d]} }'errors.out

但它似乎没有返回好的数字:( 有人知道如何解决这个问题吗? 谢谢大家!

【问题讨论】:

    标签: awk


    【解决方案1】:

    如果您想计算 ($2, $15) 的不同对,这就是我理解您对问题的描述的方式,您可以这样做,(尽管您的示例输出似乎与数据不太匹配)。

    $ cat vid.txt
    14201|video_load_time|5.7|i3|8.3|0.0|FI|GT|52.1147619|9829672936714|777|ghouso|444|6789|111|4464|7149       
    4399784|playback_error|8.0|W8|33.2|0.0|FI|TED|468|071|078410X_.ca||2314831||3805|152rorDescript|0      
    762|playback_error|70|ALFiee|4.2.2|0.0|IFI|AUED|4325|795|||81321761|3805|05|1529|
    634|app_launch_time|5.0.0|SGHI317M|4.1.2|0.0|CELAR|AUTO_ATED|4588|64|180||||3805|yes|0     
    1418|video_load_time|5.0.0.37|iP1|7.0.6|0.0|IN_HE_WIFI|AUTHEATED|45.47099941453838|477109099|||8455700500884828|111|N/A|77|9398     
    1420|playback_error|5.0.0.37|iPa1|8.1.1|0.0|WIFI|BUP|9863786|6799798072||ta99|841759656|Be000|1601|Video|22
    594|app_launch_time|5.0.0|S7M|4.3|0.0|CLAR|AUTO_ATED|5010226|-110.673567|6167612959947-023Xca|||111|N/A||11
    421|video_load_time|5.0.0.37|iP5|8.1.2|0.0|WIFI|BUP|528950658168|06.613394189||cpcpb15|84551050401|1601|N/A||182
    
    $ cat vid.awk
    { ++count[$2,$15] }
    
    END { for (i in count) {
            split(i, parts, SUBSEP);
            print parts[1] ", errcode: " parts[2] ", number of occurrences: " count[i] 
          }
    }
    
    $ awk -F\| -f vid.awk vid.txt
    app_launch_time, errcode: N/A, number of occurrences: 1
    playback_error, errcode: 1601, number of occurrences: 1
    playback_error, errcode: 3805, number of occurrences: 1
    video_load_time, errcode: 111, number of occurrences: 1
    video_load_time, errcode: N/A, number of occurrences: 2
    app_launch_time, errcode: 3805, number of occurrences: 1
    playback_error, errcode: 05, number of occurrences: 1
    

    注意虽然 awk 只支持一维数组,但是当你使用多个逗号分隔的值作为数组索引时 awk 通过连接它们将它们变成单个索引值 与内置变量SUBSEP 一起作为分隔符。这个 让您在某种程度上模仿多维数组。迭代时 但是,通过 for 循环中的索引,由您决定 使用split 将值分开。

    【讨论】:

    • 非常感谢您!是的,这对我来说非常好!对于分裂这不是问题:) 我创建了一个 phyton 来分裂它们,再次感谢
    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2022-01-13
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多