각 줄에서 한 문자를 세어 열 수로 나눕니다.

각 줄에서 한 문자를 세어 열 수로 나눕니다.

유전자형 파일 genotype-HA1_1,..., genotype-HA1_27이 많이 있습니다. 행은 SNP이고 열은 개별입니다. 개인(즉, 열)의 수는 각 유전자형 파일에 따라 다릅니다. 다음은 그 중 2가지 예입니다.

head genotype-HA1_1    
A   A   A   A   A   A   A   A   A   A
C   C   C   C   C   C   C   N   C   C
N   K   K   K   T   K   K   N   G   N
N   A   A   A   R   A   A   A   A   A
Y   Y   T   Y   C   T   Y   T   T   Y

그리고

head genotype-HA1_11
A   A   W   A   A   W   A   A   A   N   A
C   C   C   C   C   C   C   N   C   C   C
G   G   K   G   N   K   K   N   G   G   G
A   A   A   A   N   A   A   N   A   A   A

각 SNP의 총 문자 "N" 수를 계산하고 이를 루프의 각 파일에 있는 개인(즉, 열) 수로 나누고 싶습니다.

내가 원하는 출력

count-genotype-HA1_1
0
0.1
0.3
0.1
0

나는 이런 것을 사용하고 있습니다

for cfile in genotype-HA1_*; do
awk -F\N '{print NF-1/NF}' "$cfile" > count-"${cfile##*.}"; done

'N' 숫자를 계산하는 코드 부분은 잘 작동하지만, 각 파일의 열 수로 나누는 방법을 모르겠습니다.

답변1

N을 필드 구분 기호로 사용하는 대신 기본 공백 구분 기호를 사용하여 NF일반적인 해석(예: 열 수)을 갖도록 하고 s의 반환 값을 사용하여 s를 gsub계산 하는 것은 어떨까요 N?

$ awk '{print gsub("N","N")/NF}' genotype-HA1_1 
0
0.1
0.3
0.1
0

참고: gsub("N","N")레코드(행)에서 문자 발생 횟수를 계산하는 N것은 일반적으로 동일한 수의 필드와 동일하지 않습니다 N(예제 입력에서는 동일하지만). 더 엄격한 정의가 필요한 경우 KISS 메서드는 다음과 같습니다.

awk '{c = 0; for(i=1;i<=NF;i++) c += ($i == "N"); print c/NF}' genotype-HA1_1

관련 정보