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

Unix 在这些行上选择匹配的列和操作,unix,awk,grep,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.

我有一个文件,我想在其中选择列$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

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
awk'{k=$3;
如果(!(min1中的k)){max1[k]=min1[k]=1;max2[k]=min2[k]=2}
sum1[k]+=$1;sum2[k]+=$2;计数[k]+;
如果(max1[k]$1)min1[k]=$1;
如果(max2[k]$2)min2[k]=$2}
结束{for(sum1中的k)

if(max1[k]-min1[k]示例输入/输出将帮助您获得更多响应并验证脚本。对于
awk
来说,这似乎是一个微不足道的练习,我可能对这个问题不太清楚。我没有要验证的脚本,我只是不知道如何编写一个脚本,以便在我没有选择特定模式但只有特定匹配的情况下选择行。人们可以验证确定他们自己的脚本是否与您的输出相匹配。编写一个好的规范是一个非常重要的练习。例如,如果您的$3值填充了一个范围
0.9 0.95 1 1.05 1.1 1.15 1.2
或围绕两个值聚集(双模式)
0.9 1.1 0.95 2 2.01 1.91
现在我明白你的意思了,我编辑了这篇文章。@karakfa它现在足够琐碎了吗?:)我还没有找到解决办法yetThanks!如果我的输入文件中有更多的列,我怎么打印它们呢?就像编辑的问题输入/输出一样。使用
打印{$4,$5}
为每行打印第4列和第5列的相同值,而不是对应的行。最简单的方法是将它们作为键的一部分。更改为
k=$3 FS$4 FS$5
。在某一点上,您必须向上投票并接受答案。否则,人们将停止回答您的问题。好的。在本例中,min1和min2是awk函数最小值和最大值或值的名称?抱歉,我是新手,我现在才看到接受答案的选项。min1/max1只是变量名(此处为数组),max/min是在脚本中计算的。