这可能很简单,但我已经堆叠了。谢谢你的帮助。 我有一个包含两列的输入文件。在一列中我有一个ID,在第二列中有一个与之关联的值。我需要一个输出,其中第一列是ID(不允许重复),在第二列中打印平均值。 id并不总是重复,如果重复,它只能是连续的,最大重复值为2。
输入
10;10
10;20
20;30
20;40
30;15
40;10
40;12
期望的输出
10;15
20;35
30;15
40;11
答案 0 :(得分:4)
这个单行做到了:
awk -F';' -v OFS=";" '{a[$1]+=$2+0;b[$1]++}END{for(x in a)print x,a[x]/b[x]}' file
使用您的数据进行测试:
kent$ cat f
10;10
10;20
20;30
20;40
30;15
40;10
40;12
kent$ awk -F';' -v OFS=";" '{a[$1]+=$2+0;b[$1]++}END{for(x in a)print x,a[x]/b[x]}' f
10;15
20;35
30;15
40;11
答案 1 :(得分:3)
$ cat tst.awk
BEGIN { FS=OFS=";" }
($1 != prev) && (NR>1) { print prev, sum/cnt; sum=cnt=0 }
{ prev=$1; sum+=$2; cnt++ }
END { if (cnt) print prev, sum/cnt }
$ awk -f tst.awk file
10;15
20;35
30;15
40;11
答案 2 :(得分:0)
(现场直播,我没有尝试过;假设GNU awk;假设已排序的输入)
awk -F';' '
BEGIN {
id=""
}
$1 != id {
if (id != "") {
printf("%s;%d\n", id, sum/n);
n = sum = 0;
id = str($1);
}
sum += $2;
n++;
}
END {
if (n > 0) printf("%s;%s\n", id, sum/n);
}
'