Awk:按报告创建组?

时间:2011-02-25 20:38:15

标签: awk

我有一个包含制表符分隔数据的ASCII文件,如下所示:

Test_Version=2.5.3  Model-Manufacturer=D12-500
Test_Version=2.5.3  Model-Manufacturer=D12-500
Test_Version=2.6.3  Model-Manufacturer=H23-600
Test_Version=2.6.3  Model-Manufacturer=HR21-100
Test_Version=2.6.3  Model-Manufacturer=HR21-100
Test_Version=2.6.4  Model-Manufacturer=R16-300

我想用Awk创建一个按“Test_Version”分组的“模型制造商”报告:

Test_Version        Model-Manufacturer   Count-Model-Manufacturer
2.5.3               D12-500              2
2.6.3               HR21-100             2
2.6.3               H23-600              1
2.6.4               R16-300              1

这是我开始使用的但它不起作用......

awk 'BEGIN {FS="\t";} {vercounts[$1]=vercounts[$1]+1;mdlcounts[$2]=mdlcounts[$2]+1}
END     {for (key in vercounts)
            printf "%s\t%d\n", key, vercounts[key];} {for (key in mdlcounts) printf "%s\t%d\n", key, mdlcounts[key];}
' data_file

有可能吗?你会怎么做呢?

4 个答案:

答案 0 :(得分:2)

我看到它的方式,你真正想要做的是计算重复行的数量。抛弃漂亮的印刷,你真正需要的是:

{ counts[$0]++; } 
END { for (key in counts) { print key, counts[key]; } }

或者我在这里误解了什么?

答案 1 :(得分:0)

我不确定我是否理解你的期望。但我认为

{a[$0]++}  
END {for (i in a)  { print i, a[i]}  
}

会做的。

答案 2 :(得分:0)

awk -F '\t' '
  {
    split($1, ver, /=/)
    split($2, model, /=/)
    count[ver[2] FS model[2]]++
  }
  END {for (key in count) print key FS count[key]}
'

答案 3 :(得分:0)

以下一段awk片段将准确提供您正在寻找的内容

awk -F" " '{ vercounts[$0]+=1} END { for ( i in vercounts ) { a=i; gsub("Test_Version=|Model-Manufacturer=","",a) ; print a,vercounts[i]} }' file_name
2.6.4  R16-300 1
2.6.3  HR21-100 2
2.6.3  H23-600 1
2.5.3  D12-500 2