我有一个文件,我想选择第3列相同的行。现在我已经对它们进行了分组,但是我想在这些行上执行某些操作,以防$ 1(和/或$ 2)列满足某个条件。
例如 - 如果$ 1和$ 2中的所有值(在$ 3中具有相同值的行组内)彼此相差0.1,我想取列$ 1和$ 2的平均值(对于该组有相同的$ 3)。如果它更大,我想打印这些线而不用平均值。
我的输入类似于:
1.3 22.5 ALFA 45 50
1.4 22.6 ALFA 45 50
1.5 22.7 ALFA 45 50
1.6 22.8 ALFA 45 51
5.5 8.5 BETA 53 15
5.6 8.6 BETA 53 15
5.5 8.5 BETA 53 15
7.6 10.6 GAMA 75 13
7.7 10.7 GAMA 76 13
12 11.5 GAMA 75 13
4.5 4.5 DELTA 65 12
4.6 5.7 DELTA 65 12
12.1 8 EPS 44 16
12.2 8 EPS 44 16
我希望我的输出为:
out1.txt:
5.53 8.53 BETA 53 15
12.15 8 EPS 44 16
out2.txt:
1.3 22.5 ALFA 45 50
1.4 22.6 ALFA 45 50
1.5 22.7 ALFA 45 50
1.6 22.8 ALFA 45 50
7.6 10.6 GAMA 75 13
7.7 10.7 GAMA 76 13
12 11.5 GAMA 75 13
4.5 5.6 DELTA 65 12
4.6 9 DELTA 65 12
答案 0 :(得分:0)
awk
救援!
awk '{k=$3;
if(!(k in min1)) {max1[k]=min1[k]=$1; max2[k]=min2[k]=$2}
sum1[k]+=$1; sum2[k]+=$2; count[k]++;
if(max1[k]<$1) max1[k]=$1; if(min1[k]>$1) min1[k]=$1;
if(max2[k]<$2) max2[k]=$2; if(min2[k]>$2) min2[k]=$2}
END {for(k in sum1)
if(max1[k]-min1[k]<=0.1 && max2[k]-min2[k]<=0.1)
printf "%.2f\t%.2f\t%s\n",sum1[k]/count[k],sum2[k]/count[k],k}' file
12.15 8.00 EPS
5.53 8.53 BETA
很多代码,但几乎是微不足道的,但订单并没有被保留。