awk比较连续的行

时间:2015-11-24 14:34:23

标签: awk compare rows

这可能很简单,但我已经堆叠了。谢谢你的帮助。 我有一个包含两列的输入文件。在一列中我有一个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

3 个答案:

答案 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);
    }
'