2017-08-03 58 views
1

我有一个这样的文件值:平均柱如果在另一列匹配和打印作为附加列

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 

我想平均5栏如果塔4是相同的,并且打印该平均值作为6列,以便它看起来像这样:

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 

我已经尝试了几个解决方案,我发现在这里。 例如

awk '{ total[$4] += $5; ++n[$4] } END { for(i in total) print i, total[i]/n[i] }' 

,但他们都结束了这一点:

HG  1.5 
RP  0.75 
GM  5 
LS  3 

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

+0

列4中的值是否总是相邻? – choroba

+0

他们永远是。 – markryan

回答

2

您可以通过表重复两次:计算出平均值(因为你已经)在第一次循环做,然后打印出来的第二次迭代:年底

awk 'NR==FNR { total[$4] += $5; ++n[$4] } NR>FNR { print $0, total[$4]/n[$4] }' file file 

通知的file两次。在通过“第一个”文件NR==FNR时,我们总结出合适的值,并将它们保存在内存中(变量totaln)。在“第二”文件遍历,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

完美地工作,谢谢!最后两次的文件不是我以前见过的。 – markryan

+0

这只是说'awk'获得两次相同的文件。就像说'file1','file2'一样。 – randomir

1

可以使用1次通过文件,但你必须在内存中的整个文件来存储,所以磁盘I/o vs内存折衷:

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