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”