다른 열의 각 특정 문자에 대한 "A 및 B"의 빈도

다른 열의 각 특정 문자에 대한 "A 및 B"의 빈도

$1 열에 있는 각 문자에 대해 $3 및 $4 열의 A 및 B 빈도를 알고 싶습니다. 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$1ENDgsubAB. 예를 들어:

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

관련 정보