awk - 当另一列中有相同名称时计算一列的平均值

标签 awk

我有一个包含下一列的表格:

Probe Name Sec_Name Number
A_1 One Bla 2
A_2 One Bla 5
A_3 One Bla 2
B_1 Two bli 1
B_2 Third 6

我想检查第二列中的单元格是否重复,如果重复,则打印第五列及其第四列中数字的平均值。 期望的输出:

Probe Name Sec_Name Number Average
A_1 One Bla 2
A_2 One Bla 5
A_3 One Bla 2 3
B_1 Two bli 1
B_2 Third 6

表格由制表符分隔。我已经尝试过类似的操作,但是...我希望在输出中具有与输入文件中相同的列。

awk '
{
    lines[$2]++;     
    totals[$2] += $4; 
}
END {

    for (i in lines) {
        print i, lines[i], totals[i] totals[i]/lines[i];;
    }
}
' file.txt

我希望它或多或少是清楚的......

最佳答案

您可以循环访问该文件两次:

 awk 'FNR==NR {a[$2]+=$4; b[$2]++; next}
     {printf "%s %s\n", $0, (b[$2]>1?a[$2]/b[$2]:"")}' file file

说明

  • FNR==NR {a[$2]+=$4; b[$2]++; next} 在第一个循环中,计算第二列的累计值(数组 a[] - 您的 totals[])。另外,计算它出现的次数(数组 b[] - 你的 lines[])。
  • {printf "%s %s\n", $0, (b[$2]>1?a[$2]/b[$2]:"")} 在第二个循环中,打印该行以及结果。如果第二列的计数器 b[] 大于 1,则仅打印平均值。

测试

$ awk 'FNR==NR {a[$2]+=$4; b[$2]++; next} {printf "%s %s\n", $0, (b[$2]>1?a[$2]/b[$2]:"")}' file file
Probe Name Sec_Name Number 
A_1 One Bla 2 3
A_2 One Bla 5 3
A_3 One Bla 2 3
B_1 Two bli 1 
B_2 Third 6 

更新

根据Kent's great recommendation ,您可以使用以下方法打印上次第二列出现时的平均值:

awk 'FNR==NR {a[$2]+=$4; b[$2]++; c[$2]=FNR; next}
                                  ^^^^^^^^^^
     {printf "%s %s\n", $0, (b[$2]>1&&c[$2]==FNR?a[$2]/b[$2]:"")}' file file
                                    ^^^^^^^^^^^^

它在数组c[]中捕获上次第二个字段出现的行号。然后打印条件也会检查它,因此如果是最后一次出现第二列,则只打印平均值。

测试

$ awk 'FNR==NR {a[$2]+=$4; b[$2]++; c[$2]=FNR; next} {printf "%s %s\n", $0, (b[$2]>1&&c[$2]==FNR?a[$2]/b[$2]:"")}' a a
Probe Name Sec_Name Number 
A_1 One Bla 2 
A_2 One Bla 5 
A_3 One Bla 2 3
B_1 Two bli 1 
B_2 Third 6 

关于awk - 当另一列中有相同名称时计算一列的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23832303/

相关文章:

linux - 读取子文件夹中的特定行并计算平均值

awk - 使用 sed(或 awk 或 tr)将换行符\n 替换为表达式

bash - 如何使用awk删除重复的逗号分隔字符串

linux - 使用 bash、awk 或 sed 将 CSV 文件模板化为 SQL 文件

linux - 用 Awk 洗牌

bash - 如何grep最后一次出现的线型

design-patterns - awk 在模式之间打印特定变量和原始数据

linux - awk 没有按预期工作

linux - awk 在循环中使用时不打印任何内容

regex - awk 解析邮件日志中的唯一 IP 地址