linux - 使用awk计算统计量

标签 linux bash awk sed

我对我之前成功回答的问题 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/

相关文章:

linux - 当我在脚本中使用它时,无法关闭带有 echo "^]"的 scpi(telnet) session

c++ - 在 mac 上使用 osxfuse 卡住的 loggedfs

bash - 用于 Windows 的 ubuntu 上的 Mosquitto mqtt

bash - 如何删除列数错误的行

java - Linux ./configure 不会检测到 java 或 javac

linux - 如何破坏 tar.gz 的 header 以进行测试

bash - 三元运算符 (? :) in Bash

python -c 与 python -<< heredoc

bash - 在 bash 中只保留第一个重复条目

awk - 打印匹配记录后的下一条记录