我想知道 $3 和 $4 列中 A 和 B 对于 $1 列中存在的每个不同字符的频率。 Linux 中的命令行。
例子我的输入:
ID01 a1 A B
ID01 a2 A B
ID01 a3 A B
ID02 a1 B B
ID02 a2 B B
ID02 a3 B B
OA03 a1 A A
OA03 a2 A A
OA03 a3 A A
EA04 a1 -- --
EA04 a2 -- --
EA04 a3 -- --
我要这个输出:
ID01 A 0.50
ID01 B 0.50
ID02 A 0.00
ID02 B 1.00
OA03 A 1.00
OA03 B 0.00
EA04 A 0.00
EA04 B 0.00
我怎样才能做到这一点?谢谢你!
答案1
适应基于关联数组的 awk 解决方案的一种方法是连接每个$3
和的内容,然后利用返回替换数的事实来计算和在各自中的出现次数$4
$1
END
gsub
A
B
字符串。例如:
awk '{
a[$1]=a[$1]$3$4;
next;
}
END{
for (i in a) {
n = length(a[i]) == 0 ? 1 : length(a[i]); # avoid div-by-zero
printf "%s A %.1f\n", i, gsub(/A/,"",a[i])/n;
printf "%s B %.1f\n", i, gsub(/B/,"",a[i])/n;}
}' input
EA04 A 0.0
EA04 B 0.0
OA03 A 1.0
OA03 B 0.0
ID01 A 0.5
ID01 B 0.5
ID02 A 0.0
ID02 B 1.0