Linux 如果其他列中的值匹配,则平均列并作为附加列打印

Linux 如果其他列中的值匹配,则平均列并作为附加列打印,linux,awk,Linux,Awk,我有这样一个文件: Score 1 24 HG 1 Score 2 26 HG 2 Score 5 56 RP 0.5 Score 7 82 RP 1 Score 12 97 GM 5 Score 32 104 LS 3 Score

我有这样一个文件:

Score      1      24      HG      1  
Score      2      26      HG      2  
Score      5      56      RP      0.5  
Score      7      82      RP      1  
Score      12     97      GM      5  
Score      32     104     LS      3  
Score      1      24      HG      1      1.5
Score      2      26      HG      2      1.5  
Score      5      56      RP      0.5    0.75  
Score      7      82      RP      1      0.75  
Score      12     97      GM      5      5  
Score      32     104     LS      3      3  
如果第4列相同,我想计算第5列的平均值,并将平均值打印为第6列,以便如下所示:

Score      1      24      HG      1  
Score      2      26      HG      2  
Score      5      56      RP      0.5  
Score      7      82      RP      1  
Score      12     97      GM      5  
Score      32     104     LS      3  
Score      1      24      HG      1      1.5
Score      2      26      HG      2      1.5  
Score      5      56      RP      0.5    0.75  
Score      7      82      RP      1      0.75  
Score      12     97      GM      5      5  
Score      32     104     LS      3      3  
我已经尝试了我在这里找到的几种解决方案。 e、 g

但他们最终都是这样的:

HG      1.5
RP      0.75  
GM      5  
LS      3

这是不可取的,因为我丢失了很多信息。

您可以在表中迭代两次:计算第一次迭代的平均值(正如您已经做的那样),然后在第二次迭代中打印出来:

awk 'NR==FNR { total[$4] += $5; ++n[$4] } NR>FNR { print $0, total[$4] / n[$4] }' file file
请注意末尾的
文件
两次。在查看“第一个”文件时,
NR==FNR
,我们将适当的值求和,并将它们保存在内存中(变量
total
n
)。在“第二次”文件遍历期间,
NR>FNR
,我们打印出所有原始数据+平均值:

Score      1      24      HG      1     1.5
Score      2      26      HG      2     1.5
Score      5      56      RP      0.5   0.75
Score      7      82      RP      1     0.75
Score      12     97      GM      5     5
Score      32     104     LS      3     3

您可以使用1次遍历文件,但必须将整个文件存储在内存中,因此磁盘i/o与内存之间需要权衡:

awk '
    BEGIN {FS = OFS = "\t"} 
    {total[$4] += $5; n[$4]++; line[NR] = $0; key[NR] = $4} 
    END {for (i=1; i<=NR; i++) print line[i], total[key[i]] / n[key[i]]}
' file
awk'
开始{FS=OFS=“\t”}
{total[$4]+=$5;n[$4]+;line[NR]=$0;key[NR]=$4}

END{for(i=1;i第4列中的相同值总是相邻的吗?它们总是是的。工作非常完美,谢谢!末尾的文件两次不是我以前见过的。它只是意味着
awk
两次获得相同的文件。比如说
file1
file2