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]:”“)}
大于1,只需打印平均值b[]
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