使用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
这是一个变体
输入:
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