2017-05-08 23 views
0

計算計我有一些表格數據,其中第一場是一個獨特的ID,第二個觀察,如:AWK,從表格數據

1 2 
2 2 
3 5 
4 3 
5 2 
6 2 

如何使用awk來計算第二場的頻率。在得到的例子中(觀察計數):

2 4 
3 1 
5 1 

我不知道哪些觀察結果發生在手前(即0,1和4在本例中沒有發生)。我雖然我需要建立一個關聯數組,其中可以添加條目,並在發現觀察值時將值增加1,但我真的(誠實地)不知道如何做到這一點?

+0

糟糕,你忘了發佈你的代碼! StackOverflow是關於幫助人們修復他們的代碼。這不是免費的編碼服務。任何代碼都比沒有代碼更好。即使你不知道如何編寫它,甚至元代碼也會演示你如何看待程序應該起作用。 – ghoti

+0

是的,我知道 - 剛開始我真的感到難堪。 – user3375672

回答

2
$ awk '{cnt[$2]++} END{for (i in cnt) print i, cnt[i]}' file 
2 4 
3 1 
5 1 

由於運算符in以上的輸出順序實際上是隨機的。如果你想用GNU awk控制它,你只需在進入循環之前設置順序(參見https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Scanning)。例如:

要根據數字升序陣列索引排序(事實上,它是相同的順序與上述是巧合):

$ awk '{cnt[$2]++} END{PROCINFO["sorted_in"]="@ind_num_asc"; for (i in cnt) print i, cnt[i]}' file 
2 4 
3 1 
5 1 

爲了通過數字升序數組值進行排序:

$ awk '{cnt[$2]++} END{PROCINFO["sorted_in"]="@val_num_asc"; for (i in cnt) print i, cnt[i]}' file 
3 1 
5 1 
2 4 
+1

啊真的很好 - 我將不得不學習awk的數組。我有一些僞代碼。 – user3375672

1

請嘗試以下方法:

cat file.txt | awk '{ 
    dict[$2]++; 
} 
END { 
    for (key in dict) { print key, dict[key] } 
}' 
+2

這與Ed的答案完全一樣...... –

1

隨着perl它是一個LITT樂更容易地將鑰匙進入你目前的排序順序:

$ perl -lane '$seen{$F[1]}++; END{ for (sort keys %seen){ print "$_ $seen{$_}"}}' file 
2 4 
3 1 
5 1 

或者,如果你想通過頻率排序:

$ perl -lane '$seen{$F[1]}++; END{ for (sort {$seen{$a} <=> $seen{$b}} keys %seen){ print "$_ $seen{$_}"}}' file 
3 1 
5 1 
2 4 

(反向$a$b如果你想降頻VS升頻.. )

+0

通過在使用in操作符循環前定義排序順序PROCINFO [「sorted_in」] = ...',您可以在GNU awk中做同樣的事情,請參閱https ://www.gnu.org/software/gawk/manual/gawk.html#Controlling-掃描預定義的排序順序。我更新了[我的回答](http://stackoverflow.com/a/43850931/1745001)以表明這一點。 –