Awk 使用命令行计算一列的总频率

Awk 使用命令行计算一列的总频率,awk,command,frequency,Awk,Command,Frequency,我需要总结一个大文件中一列的频率 例如: abbot achievement 1 abbot acknowledge 2 abbot acknowledge 2 abbot acknowledge 3 abbot acquaintance 1 abbot acquire 2 abbot acquisition 2 abbot acre 1 abbot acre 4 abbot act 1 abbot act 4 abbot act

我需要总结一个大文件中一列的频率

例如:

abbot   achievement 1
abbot   acknowledge 2
abbot   acknowledge 2
abbot   acknowledge 3
abbot   acquaintance    1
abbot   acquire 2
abbot   acquisition 2
abbot   acre    1
abbot   acre    4
abbot   act 1
abbot   act 4
abbot   act 3
abbot   act 8
abbot   act 5
abbot   act 7
abbot   act 8
abbot   action  2
abbot   active  4
我想对最终结果相同的第1列和第2列的频率求和:

abbot   achievement 1
abbot   acknowledge 7
abbot   acquaintance    1
abbot   acquire 2
abbot   acquisition 2
abbot   acre    5
abbot   act 36
abbot   action  2
abbot   active  4
我提出了一个类似的问题: 并使用以下命令: $sort input.txt | uniq-c | awk'{print$2”\t“$3”\t“$1*$4}”`

但这并不能解决问题,因为例如,sort函数将只对相同的所有三列进行求和,从而生成一个结果,即使用所有三列的求和频率添加一个新列

有人能建议修改这个命令以产生我想要的结果吗?
或者建议一个更好的方法来解决这个问题?

使用
awk
和数组求和

awk '{ a[$1 FS $2]+=$3 } END {for (i in a) print i,a[i] }' file
abbot active 4
abbot action 2
abbot achievement 1
abbot acre 5
abbot acquire 2
abbot acknowledge 7
abbot acquisition 2
abbot act 36
abbot acquaintance 1

是的,这确实有效,但是,它会将每列之间的选项卡更改为空格。是否可以修改此打印以保持列之间的制表符间距,或者是否需要在之后执行此操作?将
FS
更改为
“\t”
,您将在
abbot
和下一个字段之间获得制表符。要获取制表符,请按如下方式添加
OFS=“\t”
awk'{a[$1”\t“$2]+=$3}END{for(a中的i)print i,a[i]}'OFS=“\t”