【问题标题】:Using awk how to to merge lines which are duplicates based on multiple columns and substitute the average for another column使用 awk 如何合并基于多列的重复行并将平均值替换为另一列
【发布时间】:2017-04-28 10:38:44
【问题描述】:

这是一个变体 Using awk how do I print all lines containing duplicates of specific columns?

输入:

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 duplicates multiple-columns substitution


【解决方案1】:

gawk 方法:

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, SUBSEP); - 将复合键拆分为包含第 1、第 3 和第 4 个字段值的数组

【讨论】:

    【解决方案2】:

    试试这个班轮:

    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
    
    • 它首先计算平均值并保存在哈希表的值中
    • 处理完所有行后,只需将计算结果插入第二个字段位置即可。
    • 请注意,输出中的行顺序可能与输入不同。

    【讨论】:

      【解决方案3】:

      间接方法

      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
      

      【讨论】:

        猜你喜欢
        • 2017-04-11
        • 2020-07-12
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        • 2017-08-29
        • 2021-05-10
        • 1970-01-01
        • 2021-12-02
        相关资源
        最近更新 更多