使用awk计算统计量

时间:2017-06-20 16:02:46

标签: linux bash awk sed

我对@fedorgui之前成功回答的问题here有疑问。

我有一张桌子:

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,而uniq第一列出现在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

这更复杂我有数千行。谢谢你的任何想法。

1 个答案:

答案 0 :(得分:5)

添加到第二个数组时,只需检查该行是否唯一。

<a href="http://www.google.com">Google</a>

或者如果您的示例中的行末尾没有随机空格,则可以使用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