我有一个包含三列的文件。当列对成对存在时,我试图总结第三列中的值。我的文件看起来像这样;
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
答案 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%