将同一字符串中每个字符串旁边的数字相加并取平均值

时间:2019-02-20 11:53:29

标签: bash

hotel_99466.dat:5
hotel_99466.dat:4
hotel_99466.dat:5
hotel_99466.dat:3
hotel_99762.dat:5
hotel_99762.dat:4
hotel_99762.dat:2
hotel_99762.dat:5

我希望通过根据酒店编号平均数字来简化此操作。并删除“ .dat:”,以便将该列表简化为:

hotel_99466 4.25
hotel_99762 4

这将需要进入bash脚本。上面的数据是grep命令的输出,因此,如果有人有任何答案,我可以通过它进行流水处理。非常感谢。

2 个答案:

答案 0 :(得分:1)

awk应该这样做:

awk -F: '{
   c[$1]++
   s[$1]+=$2
}
END {
   for (i in c) { 
      avg = s[i] / c[i]
      sub(/\.dat$/, "", i)
      printf "%s %.2f\n", i, avg
   }
}' input_file

或者作为单线:

awk -F: '{c[$1]++;s[$1]+=$2}END{for(i in c){avg=s[i]/c[i];sub(/\.dat$/,"",i);printf "%s %.2f\n",i,avg}}' input_file

答案 1 :(得分:0)

安装GNU datamash并使用

yourCommand | datamash -t: -g 1 mean 2 | sed 's/\.dat:/ /'

Datamash将按第一个字段分组,并计算每个组中第二个字段的平均值。 Datamash的输出将为

hotel_99466.dat:4.25
hotel_99762.dat:4

Sed然后将对该输出进行后处理,以将.dat:替换为空格

hotel_99466 4.25
hotel_99762 4