如何使用grep / awk在多行中进行聚合平均?

时间:2018-01-30 01:38:20

标签: linux shell awk grep find

假设我有一堆具有以下模式的文件:

文件1:

 head1
 random words
 number=100
 random words
 ...
 head2
 random words
 number=200
 random words
 ...
 head1
 random words
 number=200
 random words
 ...

文件2:

 head1
 random words
 number=1000
 random words
 ...
 head2
 random words
 number=200
 random words
 ...
 head1
 random words
 number=2000
 random words
 ...

我想看看哪个文件在head1下平均有更大的数字,在这种情况下,文件1有(100 + 200) / 2 = 150而文件2有(1000 + 2000)/2 = 1500

所以我想以任何格式打印出这个结果,但有一个可能是:

File 1: 150
File 2: 1500

我对linux命令很新,有谁可以帮我解决这个问题?

1 个答案:

答案 0 :(得分:-1)

脚本

  #!/bin/csh
  foreach x (file1 file2 file3)
        echo -n $x" :"
        sed -n '/head1/,/\.\.\./p' $x |\
        awk -F "=" ' BEGIN{sum=0;cnt=0}\
                 /number/{sum=sum+$2;cnt++}\
                 END{if(cnt)print sum/cnt;else print " " sum}'  
   end

输出3个文件

 file1 : 150
 file2 : 2000
 file3 : 0

解释

1)使用foreach x (file1 file2 file3)

运行所有相关文件

2)打印文件名,而不是行echo -n $x" :"

3)仅包含原始文件的相关部分 sed -n '/head1/,/\.\.\./p' $x |\ sed -n无声,/first str/,/second str/p介于2个字符串之间,$x文件的名称来自循环)

4)将字段分隔符设置为“=”awk -F "=",设置总和和计数以计算平均值BEGIN{sum=0;cnt=0},如果行包含数字inc cnt和“=”car {{1}之后的总和值}

5)检查是否有任何数字相加,如果有打印平均值,则打印0 /number/{sum=sum+$2;cnt++}

输入文件

file1:100 + 200 = 300 300/2 = 150

END{if(cnt)print " "sum/cnt;else print " " sum}'

file2:1000 + 2000 + 3000 = 6000 6000/3 = 2000

  head1
  random words
  number=100
  random words
  ...
  head2
  random words
  number=200
  random words
  ...
  head1
  random words
  number=200
  random words
  ...

file3:没有head1 - > 0

  head1
  random words
  number=1000
  random words
  ...
  head1
  random words
  number=2000
  random words
  ...
  head1
  random words
  number=3000
  random words
  ...