2017-06-20 150 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