Awk 比较连续行

Awk 比较连续行,awk,compare,rows,Awk,Compare,Rows,这可能很简单,但我累坏了。谢谢你的帮助。 我有一个有两列的输入文件。在一列中我有一个ID,在第二列中有一个与之关联的值。我需要一个输出,其中第一列将是ID不允许重复,在第二列的平均值打印。ID并不总是重复的,如果重复,则只能连续重复,且最大重复值为2 输入 期望输出 10;15 20;35 30;15 40;11 写活了,我没有试过;假设GNU awk;假定已排序的输入 awk -F';' ' BEGIN { id="" } $1 != id {

这可能很简单,但我累坏了。谢谢你的帮助。 我有一个有两列的输入文件。在一列中我有一个ID,在第二列中有一个与之关联的值。我需要一个输出,其中第一列将是ID不允许重复,在第二列的平均值打印。ID并不总是重复的,如果重复,则只能连续重复,且最大重复值为2

输入

期望输出

10;15
20;35
30;15
40;11

写活了,我没有试过;假设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);
    }
'

这个班轮可以:

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

本网站上的任何问题都与此非常相似,您应该能够从中找到答案。对不起,我已经检查了其中的一些问题,但仍然感到困惑。。。有其他帮助吗?@fedorqui-true,我有OFS,我删除了OFS,因为我有printf,无论如何,OFS会使printf更长-@费多尔基你说得对!!我忘了a/b将是int。。。。。呃。。。我经常更新它!但是,如果输入文件中确实有其他列也要打印平均值,该怎么办?我想这将是我很容易添加到您的脚本,但我真的不知道如何。。。实际的输入文件有80列作为我提到的第二列…没关系!我从你们身上学到了很多东西,有时我很高兴向你们展示一些东西:DJust提到输出将是随机顺序的,事实上它与上面的输入顺序相同,是纯共相关的。为什么要将0添加到$2中?没有什么gawk的特别之处,但是运行上面的命令会产生语法错误,因为试图在单引号分隔的脚本中使用单引号,而且awk中没有名为str的函数,也不需要虚假的尾随分号,printf是内置的,不是函数,所以printf参数周围的paren没有做你可能认为他们在做的事情。一旦所有这些都被修复,如果在一个空文件上运行,它也会失败,并出现一个被零除的错误。@EdMorton我可以接受这一点。我是直接写的,没有像警告的那样经过测试。请注意,OP在询问之前没有尝试任何东西。我修正了最明显的错误;我不知道printf,我总是这样使用它,而且它很有效。非常感谢!但是,如果输入文件中确实有其他列也要打印平均值,该怎么办?我想这将是我很容易添加到您的脚本,但我真的不知道如何。。。实际输入文件有80列,作为我提到的第二列,因此您应该在问题的示例输入/输出中真正显示这些其他列。无论你想做什么都是微不足道的,但你的评论可能意味着以下几件事之一。否-不要显示80列,3列或4列就可以了。@user3666956一些建议-在软件解决方案中,1项和2项、2项和3项之间存在着巨大的差异。连续项目和非连续项目之间也存在巨大差异。因此,如果你正在发布一个问题,想想如何展示一个捕捉你的问题的最小例子,但是如果真正的问题涉及3个或更多的项目,那么不要显示一个1个项目甚至2个项目的例子,并希望解决方案与3个或更多的项目相同。抱歉,这是一个新手错误……我会为将来考虑这个问题。我想我需要发布一个新的问题,因为你在这方面没有帮助我?不管怎样,谢谢你的建议,再次表示歉意!没有人会仅仅因为你没有完成我们告诉你需要为你做的事情而帮助你,就帮助你满足你的新需求——编辑你的问题以显示反映这些需求的更新样本输入/输出。然而,已经过了很长时间,我怀疑是否有人在看这个问题,所以在这一点上,你最好标记一个被接受的答案,并提出一个新的问题。
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
$ 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