2017-06-20 188 views
1

我有一個關於我之前成功回答的問題here by @fedorgui的問題。使用awk計算統計信息

我有一個表:

pac1 xxx 
pac1 yyy 
pac1 zzz 
pac2 xxx 
pac2 uuu 
pac3 zzz 
pac3 uuu 
pac4 zzz 

,我需要計算這樣的輸出:

pac1 xxx 2/4 
pac1 yyy 1/4 
pac1 zzz 3/4 
pac2 xxx 2/4 
pac2 uuu 2/4 
pac3 zzz 2/4 
pac3 uuu 2/4 
pac4 zzz 3/4 

其中第一個數字是在列中唯一出現的二/唯一出現在一列(在此案例xxx發生2列2和uniq列1是4 => 2/4

在awk中的解決方案在這裏:

$ awk 'FNR==NR {col1[$1]++; col2[$2]++; next} {print $0, col2[$2] "/" length(col1)}' file file 

但我的輸入可能複製像行:

pac1 xxx 
pac1 xxx 
pac1 xxx 
pac1 yyy 
pac1 zzz 
pac2 xxx 
pac2 xxx 
pac2 xxx 
pac2 uuu 
pac3 zzz 
pac3 uuu 
pac4 zzz 
pac4 zzz 

,我需要做同樣的計算,但僅用於uniq的行,此統計添加到像所有行(不計算重複行) :

pac1 xxx 2/4 
pac1 xxx 2/4 
pac1 xxx 2/4 
pac1 yyy 1/4 
pac1 zzz 3/4 
pac2 xxx 2/4 
pac2 xxx 2/4 
pac2 xxx 2/4 
pac2 uuu 2/4 
pac3 zzz 2/4 
pac3 uuu 2/4 
pac4 zzz 3/4 
pac4 zzz 3/4 

這是更復雜我有成千上萬的行。謝謝你的任何想法。

+0

數字和計算就像例1中相同 - 我需要做的計算像:uniq Geroge

+1

嘗試'FNR == NR {if(!seen [$ 0] ++){col1 [$ 1] ++; col2 [$ 2] ++;} next}'(但你需要從行尾刪除多餘的空格)... else嘗試'if(!seen [$ 1 $ 2] ++)' – Sundeep

+0

這是我嘗試的,但問題是,這是文件的一部分 - 我有更多的列,這不是唯一的,所以我只需要檢查這兩列的uniq。 – Geroge

回答

5

只需在添加到第二個數組時檢查該行是否是唯一的。

awk 'FNR==NR{a[$1];b[$2]+=!c[$1,$2]++;next}{print $0, b[$2] "/" length(a)}' test{,} 

pac1 xxx 2/4 
pac1 xxx 2/4 
pac1 xxx 2/4 
pac1 yyy 1/4 
pac1 zzz 3/4 
pac2 xxx 2/4 
pac2 xxx 2/4 
pac2 xxx 2/4 
pac2 uuu 2/4 
pac3 zzz 3/4 
pac3 uuu 2/4 
pac4 zzz 3/4 
pac4 zzz 3/4 

或者如果沒有隨機空間在喜歡你的示例行結束時,你可以只使用$0,而不是$1,$2

+0

謝謝,我會測試它 - 我可以不使用$ 0,因爲我有更多的列,這不是唯一的。 – Geroge