2017-06-20 15 views
1

以前は正常に回答された質問here @fedorguiに質問があります。awkを使用して統計量を計算します

私はテーブルを持っている:

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

そして、私はこのような出力を計算する必要があります。

最初の数がこの列1(列2 /独自の出現で独特の出現である
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 

case 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

数字と計算の$0を使用することができますは、例1のように同じです - 私は次のように計算を行う必要があります:uniq Geroge

+1

try 'FNR == NR {if(!seen [$ 0] ++){col1 [$ 1] ++;あなたが行の最後から余分なスペースを取り除く必要があります... else if '{$ 1 $ 2} ++)' – Sundeep

+0

これは私が試した問題ですが、これはファイルの一部です - 私はもっとユニークではないカラムを持っていますので、この2つのカラムに対してuniqをチェックする必要があります。 – Geroge

答えて

5

2番目の配列に追加するときに行が一意であるかどうかを確認するだけです。

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 

またはランダムなスペースがあなたの例のような行の末尾に存在していない場合は、だけではなく、$1,$2

+0

一意ではないもっと多くの列があるので、$ 0を使用しないでください。 – Geroge

関連する問題