Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用awk根据列值计算不同的和_Shell_If Statement_Awk - Fatal编程技术网

Shell 使用awk根据列值计算不同的和

Shell 使用awk根据列值计算不同的和,shell,if-statement,awk,Shell,If Statement,Awk,我有一个包含5列的文件: 1 1311 2 171115067 1.1688e-08 1 1313 3 171115067 1.75321e-08 1 1314 4 171115067 2.33761e-08 2 1679 5 135534747 3.68909e-08 2 1680 2 135534747 1.47564e-08 3 688 34 191154276 1.77867e-07 3

我有一个包含5列的文件:

1   1311    2   171115067   1.1688e-08
1   1313    3   171115067   1.75321e-08
1   1314    4   171115067   2.33761e-08
2   1679    5   135534747   3.68909e-08
2   1680    2   135534747   1.47564e-08
3   688 34  191154276   1.77867e-07
3   689 38  191154276   1.98792e-07
3   690 39  191154276   2.04024e-07
我想获得字段
$1
中给出的每个索引的累积值
$2*$3/$4

因此,作为一个例子:对于索引
1
,我应该有
(1311*2+1313*3+1314*4)/171115067
,对于
$1
中的索引
2
,它应该是
(1679*5+1680*2)/135534747

我尝试的是:

awk '{sum+=($2*$3)/$4} END { print "Result = ",sum}'
但这给了我所有乘法的总和除以每一次,这不是我需要的

编辑:根据OP的评论,添加了FLOWING解决方案,这也将给出所有列1的总和

awk '
prev!=$1 && prev{
  if(fourth){
    printf("%.9f\n",mul/fourth)
    sum+=sprintf("%.9f\n",mul/fourth)
  }
  else{
    print 0
  }
  mul=fourth=prev=""
}
{
  mul+=$2*$3
  fourth=$4
  prev=$1
  total_sum[$1]+=($2*$3)
}
END{
  if(prev){
    if(fourth){
       printf("%.9f\n",mul/fourth)
       sum+=sprintf("%.9f\n",mul/fourth)
    }
    else{
       print 0
    }
  }
  print "total= ",sum
}'  Input_file


你能试试下面的吗

awk '
prev!=$1 && prev{
  if(fourth){
    printf("%.9f\n",mul/fourth)
  }
  else{
    print 0
  }
  mul=fourth=prev=""
}
{
  mul+=$2*$3
  fourth=$4
  prev=$1
}
END{
  if(prev){
    if(fourth){
      printf("%.9f\n",mul/fourth)
    }
    else{
      print 0
    }
  }
}'  Input_file

如果您的数据已排序,您可以执行以下操作:

awk '(NR==1) { num=0; den=$4; tmp=$1 }
     ($1!=tmp) { print "Result",tmp,":",num/den;
                 num=0; den=$4; tmp=$1 }
     { num+= $2*$3 }
     END { print "Result",tmp,":",num/den }' file
awk '{ sum[$1]+= $2*$3/$4 }
     END { for(i in sum) { print "Result",i,":",sum[i] }' file
如果您的数据未排序,您可以执行以下操作:

awk '(NR==1) { num=0; den=$4; tmp=$1 }
     ($1!=tmp) { print "Result",tmp,":",num/den;
                 num=0; den=$4; tmp=$1 }
     { num+= $2*$3 }
     END { print "Result",tmp,":",num/den }' file
awk '{ sum[$1]+= $2*$3/$4 }
     END { for(i in sum) { print "Result",i,":",sum[i] }' file
这就产生了:

Result 1 : 6.90588e-05
Result 2 : 8.67305e-05
Result 3 : 0.000400117
使用Perl

$ cat sara.txt
1   1311    2   171115067   1.1688e-08
1   1313    3   171115067   1.75321e-08
1   1314    4   171115067   2.33761e-08
2   1679    5   135534747   3.68909e-08
2   1680    2   135534747   1.47564e-08
3   688 34  191154276   1.77867e-07
3   689 38  191154276   1.98792e-07
3   690 39  191154276   2.04024e-07
$ perl -lane ' $kv{join(",",$F[0],$F[3])}+=$F[1]*$F[2]; END { for(sort keys %kv) { @x=split(",");print "$x[0],",$kv{$_}/$x[1]} print eval(join("+",values %kv)) } ' sara.txt
1,6.90587930518123e-05
2,8.67305267482441e-05
3,0.000400116605291111
100056
$

这将给出我的每个范围,这是正确的,但是如何计算所有结果的总和?@SaraWasl,你的意思是不管
$1
的值是多少?不,不,通过这个计算,我们有很多关于$1的值,我需要求和它们all@SaraWasl,不清楚,你能在这里贴一个例子吗?是的,最后一个对我有用,非常感谢:)你能用它更新你的答案吗