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命令的输出,因此,如果有人有任何答案,我可以通过它进行流水处理。非常感谢。
答案 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