反向对列的第三列求和

时间:2018-08-09 15:27:24

标签: unix awk

我有一个包含三列的文件。当列对成对存在时,我试图总结第三列中的值。我的文件看起来像这样;

200 297 3.0%
57 55 40.1%
57 56 16.5%
55 57 59.9%
56 57 83.5%

我想对[$1, $2] = [$2, $1]时的第三列求和,并通过保留其百分比之和来减少文件数量。 所以我最终期望得到的是;

200 297 3.0%
57 55 100%
57 56 100% 

我不是awk的专家,但是我尝试修改在这里找到的一些代码,并尝试针对可能的情况进行优化,但是没有达到我的期望。

我尝试过

awk '{tmp1=$1 $2; tmp2=$2 $1; if(tmp1 in arr || tmp2 in arr) {next} arr[$1 $2] +=$3} END {for(i in arr) { print arr[i]}}' infile > outfile

也尝试过

awk ' ! Pairs[$1, $2] {Pairs[$1, $2] = Pairs[$2, $1] += $3; print $0 } ' infile > outfile

3 个答案:

答案 0 :(得分:2)

$ awk '{sub("%","",$NF); 
        if( ($2 FS $1) in a) a[$2 FS $1]+=$3; 
        else a[$1 FS $2]=$3} END{for(k in a) print k, a[k]"%"}' file

200 297 3.0%
57 55 100%
57 56 100%

可能有一种更简单的方法...

答案 1 :(得分:0)

请您尝试以下。

awk '(($2,$1) in a){a[$2,$1]+=$3+0;next}{a[$1,$2]=$3+0} END{for(i in a){print i,a[i]"%"}}' SUBSEP=" "  Input_file

答案 2 :(得分:0)

$ awk '
    { val[$1>$2 ? $1 OFS $2 : $2 OFS $1] += $3 }
    END { for (key in val) print key, val[key]"%" }
' file
297 200 3%
57 55 100%
57 56 100%