2011-02-25 69 views
2

我有一個包含這樣的製表符分隔數據的ASCII文件:awk:通過報告創建組?

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 

這可能嗎?你會怎麼做呢?

回答

2

我看到它的方式,你真正想要做的是計算重複行數。留下美麗的印刷,你真正需要的是:

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

或者我誤解了這裏的東西?

+0

你打我一秒鐘:) –

+0

真棒!你的解決方案就像一個魅力。非常感謝!!我只能渴望像你一樣成爲一名知識淵博的人。 – Chris

0

我不知道我是否理解你的期望。但我認爲

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

會做。

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]} 
' 
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