Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 在另一列中使用相同名称时计算列的平均值_Awk - Fatal编程技术网

Awk 在另一列中使用相同名称时计算列的平均值

Awk 在另一列中使用相同名称时计算列的平均值,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

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

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[]
    -您的
    总计[]
    )。另外,计算它出现的次数(数组
    b[]
    -您的
    行[]
  • {printf”%s%s\n“,$0,(b[$2]>1?a[$2]/b[$2]:”“)}
    在第二个循环中,将行与结果一起打印。如果第二列的计数器
    b[]
    大于1,只需打印平均值
试验 更新 根据,您可以使用以下方法打印上次第2列出现时的平均值:

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[]
中捕捉上次出现第二个字段时的行号。然后,打印条件也会对其进行检查,以便在最后一次出现第2列时只打印平均值

试验
+1,并获得与OP所需的完全相同的输出:
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]:“)}f
耶!很好,很好。更新反映您的建议。谢谢@Kent:)太完美了。还感谢您的清晰解释。{printf“%s\t%s\n”$0,(b[$2]>1?a[$2]/b[$2]:“”),只需用制表符而不是空格分隔第五列:)
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
                                    ^^^^^^^^^^^^
$ 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