유전자형 파일 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