計算計我有一些表格數據,其中第一場是一個獨特的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,但我真的(誠實地)不知道如何做到這一點?
計算計我有一些表格數據,其中第一場是一個獨特的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,但我真的(誠實地)不知道如何做到這一點?
$ 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
啊真的很好 - 我將不得不學習awk的數組。我有一些僞代碼。 – user3375672
請嘗試以下方法:
cat file.txt | awk '{
dict[$2]++;
}
END {
for (key in dict) { print key, dict[key] }
}'
這與Ed的答案完全一樣...... –
隨着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升頻.. )
通過在使用in操作符循環前定義排序順序PROCINFO [「sorted_in」] = ...',您可以在GNU awk中做同樣的事情,請參閱https ://www.gnu.org/software/gawk/manual/gawk.html#Controlling-掃描預定義的排序順序。我更新了[我的回答](http://stackoverflow.com/a/43850931/1745001)以表明這一點。 –
糟糕,你忘了發佈你的代碼! StackOverflow是關於幫助人們修復他們的代碼。這不是免費的編碼服務。任何代碼都比沒有代碼更好。即使你不知道如何編寫它,甚至元代碼也會演示你如何看待程序應該起作用。 – ghoti
是的,我知道 - 剛開始我真的感到難堪。 – user3375672