使用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

那么,你是怎么做的呢?那么,合并数据的规则是什么呢?来吧,你已经问过并收到了多个问题的答案,你现在一定学到了一些东西-让我们看看你的尝试!尝试什么?那么,是什么尝试了这样做?那么,合并数据的规则是什么?来吧,你已经问了并收到了多个问题的答案,你现在一定学到了什么-让我们看看尝试!尝试什么?