我对我之前成功回答的问题 here 有疑问通过@fedorgui。
我有一张 table :
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
这更复杂,我有数千行。谢谢你的任何想法。
最佳答案
添加到第二个数组时只需检查该行是否唯一。
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
关于linux - 使用awk计算统计量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44657928/