使用awk如何合并基于多列重复的行并将平均值替换为另一列

Using awk how to to merge lines which are duplicates based on multiple columns and substitute the average for another column

这是一个变体

输入:

a;3;c;1
a;6;b;2
a;5;c;1

输出:

a;4;c;1
a;6;b;2

因此,所有与第 1、3 和 4 列重复的行应合并为一行,并在中打印第 2 列的平均值 第 2 列。所有没有重复的行(根据第 1,3 和 4 列)应按原样打印。

试试这个衬垫:

awk -F';' '{k= FS  FS ;t[k]++;a[k]=(+a[k])/t[k]}
          END{for(x in a){sub(FS,FS a[x]"&",x);print x}}' file
  • 它首先计算平均值并保存在哈希表的值中
  • 所有行处理完毕后,将计算结果插入到第2个字段位置即可。
  • 请注意,输出中的行顺序可能与输入中的不同。

gawk 方法:

awk -F";" '{a[,,]+=; ++c[,,]}END{OFS=";"; for(i in a){ 
     split(i, sep, SUBSEP); print sep[1],a[i]/c[i],sep[2],sep[3]}}' file

输出:

a;6;b;2
a;4;c;1

a[,,]+=; - 按相同的第 1、第 3 和第 4 个字段对行进行分组,累积第 2 个字段值

++c[,,] - 统计分组记录数

split(i, sep, SUBSEP); - 将复合键拆分为包含第一、第三和第四字段值的数组

间接方法

swap12() { awk 'BEGIN{FS=OFS=";"} {t=;=;=t}1' "";} 
swap12 file | 
awk 'BEGIN {FS=OFS=";"} 
           {k= FS  FS ; a[k]+=; c[k]++} 
     END   {for(k in a) print a[k]/c[k],k}' | 
swap12