在这些行上选择匹配的列和操作

时间:2017-02-22 17:58:12

标签: unix awk grep

我有一个文件,我想选择第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

1 个答案:

答案 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

很多代码,但几乎是微不足道的,但订单并没有被保留。