File linux中的列聚合

File linux中的列聚合,file,bash,sed,awk,aggregation,File,Bash,Sed,Awk,Aggregation,我有这样格式的巨大文本文件: aaa bbb 1 aaa ccc 2 aaa ddd 3 bbb ww 1 bbb kio 3 我想对其进行汇总,结果应为: aaa bbb 1/6 aaa ccc 2/6 aaa ddd 3/6 bbb ww 1/4 bbb kio 3/4 第三列-概率p(y | x) 我应该如何使用awk,sed来实现这一点 awk 'NR==FNR{a[$1]+=$3;next}{print

我有这样格式的巨大文本文件:

aaa bbb 1      
aaa ccc 2      
aaa ddd 3      
bbb ww 1      
bbb kio 3      
我想对其进行汇总,结果应为:

aaa bbb 1/6  
aaa ccc 2/6  
aaa ddd 3/6  
bbb ww 1/4  
bbb kio 3/4  
第三列-概率p(y | x)

我应该如何使用awk,sed来实现这一点

awk 'NR==FNR{a[$1]+=$3;next}{printf("%s/%d\n",$0,a[$1])}' ./infile ./infile
输出
你可以在两次传球中完成。使用以下命令生成a.tmp:

创建包含组总数的临时文件:

bbb 4
aaa 6
然后用以下方法进行第二次传递:

BEGIN {
    while ((getline line < "a.tmp") > 0) {
        split(line, fields, " ")
        group[fields[1]] = fields[2]
    }
    close("a.tmp")
}
{   printf("%s/%d\n", $0, group[$1]) }

这可能适合您:

awk 'func p(){for(x=0;x<c;x++)printf("%s/%d\n",l[x],t);k=$1;t=c=0};BEGIN{k=$1};$1!=k{p()};{l[c++]=$0;t+=$3};END{p()}' file
aaa bbb 1/6
aaa ccc 2/6
aaa ddd 3/6
bbb ww 1/4
bbb kio 3/4

awk'func p(){for(x=0;x假设x是第一列,y是第二列,输出中的第三列不是成对(x,y)的概率。相反,它是给定x,p(y | x)的y的条件概率。是的,你说得对,很抱歉输入错误
BEGIN {
    while ((getline line < "a.tmp") > 0) {
        split(line, fields, " ")
        group[fields[1]] = fields[2]
    }
    close("a.tmp")
}
{   printf("%s/%d\n", $0, group[$1]) }
aaa bbb 1/6
aaa ccc 2/6
aaa ddd 3/6
bbb ww 1/4
bbb kio 3/4
awk 'func p(){for(x=0;x<c;x++)printf("%s/%d\n",l[x],t);k=$1;t=c=0};BEGIN{k=$1};$1!=k{p()};{l[c++]=$0;t+=$3};END{p()}' file
aaa bbb 1/6
aaa ccc 2/6
aaa ddd 3/6
bbb ww 1/4
bbb kio 3/4