使用awk如何合并基于多列的重复行,并用平均值替换另一列
这是上的一个变体 输入:使用awk如何合并基于多列的重复行,并用平均值替换另一列,awk,duplicates,multiple-columns,substitution,Awk,Duplicates,Multiple Columns,Substitution,这是上的一个变体 输入: 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=$1 FS $3 FS $4;t[k]++;a[k]=($2+a[k])/t[k]} END{for(x in a){sub(FS,FS a[x]"&",x);print
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=$1 FS $3 FS $4;t[k]++;a[k]=($2+a[k])/t[k]}
END{for(x in a){sub(FS,FS a[x]"&",x);print x}}' file
- 它首先计算平均值并保存在哈希表的值中
- 处理完所有行后,只需将计算结果插入第二个字段位置
- 请注意,输出中的行顺序可能与输入不同
awk -F';' '{k=$1 FS $3 FS $4;t[k]++;a[k]=($2+a[k])/t[k]}
END{for(x in a){sub(FS,FS a[x]"&",x);print x}}' file
- 它首先计算平均值并保存在哈希表的值中
- 处理完所有行后,只需将计算结果插入第二个字段位置
- 请注意,输出中的行顺序可能与输入不同
awk -F";" '{a[$1,$3,$4]+=$2; ++c[$1,$3,$4]}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代码>-按相同的第1、第3和第4字段对行分组,累加第2字段值
++c[$1,$3,$4]
-计算分组记录的数量
split(i、sep、subsp)代码>-将复合键拆分为包含第1、第3和第4个字段值的数组
awk -F";" '{a[$1,$3,$4]+=$2; ++c[$1,$3,$4]}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代码>-按相同的第1、第3和第4字段对行分组,累加第2字段值
++c[$1,$3,$4]
-计算分组记录的数量
split(i、sep、subsp)代码>-将复合键拆分为包含第1、第3和第4个字段值的数组间接方法
swap12() { awk 'BEGIN{FS=OFS=";"} {t=$1;$1=$2;$2=t}1' "$1";}
swap12 file |
awk 'BEGIN {FS=OFS=";"}
{k=$2 FS $3 FS $4; a[k]+=$1; c[k]++}
END {for(k in a) print a[k]/c[k],k}' |
swap12
间接方法
swap12() { awk 'BEGIN{FS=OFS=";"} {t=$1;$1=$2;$2=t}1' "$1";}
swap12 file |
awk 'BEGIN {FS=OFS=";"}
{k=$2 FS $3 FS $4; a[k]+=$1; c[k]++}
END {for(k in a) print a[k]/c[k],k}' |
swap12
那么,你是怎么做的呢?那么,合并数据的规则是什么呢?来吧,你已经问过并收到了多个问题的答案,你现在一定学到了一些东西-让我们看看你的尝试!尝试什么?那么,是什么尝试了这样做?那么,合并数据的规则是什么?来吧,你已经问了并收到了多个问题的答案,你现在一定学到了什么-让我们看看尝试!尝试什么?