2017-05-08 64 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)以表明这一点。 –