2017-08-03 61 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