加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 检查两行是否以相同的字符开头,如果是,则输出平均值(如

发布时间:2020-12-16 01:36:36 所属栏目:安全 来源:网络整理
导读:我想检查第一列中两行是否以相同的数字开头,如果发生这种情况,则应显示第二列的平均值.文件示例: 01 21 6 10% 93.3333%01 22 50 83.3333% 93.3333%02 20.5 23 18.1102% 96.8504%02 21.5 100 78.7402% 96.8504%03 22.2 0 0% 100%03 21.2 29 100% 100%04 22.5
我想检查第一列中两行是否以相同的数字开头,如果发生这种情况,则应显示第二列的平均值.文件示例:
01  21    6    10%       93.3333%
01  22    50   83.3333%  93.3333%
02  20.5  23   18.1102%  96.8504%
02  21.5  100  78.7402%  96.8504%
03  22.2  0    0%        100%
03  21.2  29   100%      100%
04  22.5  1    5.55556%  100%
04  23.5  17   94.4444%  100%
05  22.7  9    7.82609%  100%
05  21.7  106  92.1739%  100%
06  23    11   17.4603%  96.8254%
06  22    50   79.3651%  96.8254%
07  20.5  14   18.6667%  96%
07  21.5  58   77.3333%  96%
08  21.8  4    100%      100%
09  22.6  0    0%        100%
09  21.6  22   100%      100%

例如,两个第一行以01开头,但只有一行以08(第15行)开头.因此,基于这两种情况的输出应该是:

01 21.5
...
...
...
08 21.8
...
...
...

我最终得到了以下awk行,当文件总是有两条相似的行时效果很好,但它使用上面显示的文件失败了(因为第15行):

awk '{sum+=$2} (NR%2)==0{print sum/2; sum=0;}'

任何提示都受到欢迎,

这awk应该工作:
awk 'function dump(){if (n>0) printf "%s%s%.2fn",p,OFS,sum/n}
     NR>1 && $1 != p{dump(); sum=n=0} {p=$1; sum+=$2; n++} END{dump()}' file
01 21.5
02 21.0
03 21.7
04 23.0
05 22.2
06 22.5
07 21.0
08 21.8
09 22.1

说明:我们使用3个变量:

p -> to hold previous row's $1 value
n -> count of similar $1 values
sum -> is sum of $2 values for similar $1 rows

这个怎么运作:

NR>1 && $1 != p     # when row #1 > 1 and prev $1 is not current $1
dump()              # function is to print formatted value of $1 and average
p=$1; sum+=$2; n++  # sets p to $1,adds current $2 to sum and increments n

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读