dna 파일을 가져와 개행 문자나 공백 문자가 없는지 확인한 다음 고유 코돈과 해당 발생 횟수를 출력하는 bash 스크립트를 만들고 싶습니다. 다음 코드를 사용했지만 codon이 계속 "bash-3.2$"를 제공합니다. 구문이 잘못된 것인지, 왜 올바른 출력을 얻지 못하는 것인지 혼란스럽습니다.
! /bin/bash
for (( pos=1; pos < length - 1; ++pos )); do
codon = substr($1, $pos, 3)
tr-d '\n' $1 | awk -f '{print $codon}' | sort | uniq -c
done
예를 들어 dnafile이라는 파일에 aacacgaactttaacacg 패턴이 포함되어 있으면 스크립트는 다음 입력 및 출력을 사용합니다.
$script dnafile
aac 3
acg 2
ttt 1
답변1
스크립트의 첫 번째 줄이 새 bash
셸을 시작하기 때문에 해당 출력을 얻습니다.
이 줄은 읽어야합니다
#!/bin/bash
( #
시작 부분에 주의하세요).
그런 다음 awk
절대로 작동하지 않는 방식으로 구문과 셸 코드를 혼합합니다.
대신, 단순하게 유지하고 파일을 세 개의 문자 그룹으로 나누고 정렬한 다음 얻을 수 있는 고유한 문자 수를 세어보세요.
$ fold -w 3 dnafile | sort | uniq -c
3 aac
2 acg
1 ttt
이 접근 방식은 입력이 항상 3개의 문자의 배수를 포함하고 포함된 공백이나 다른 문자가 없는 한 작동합니다.
답변2
(echo aacacgaactttaacacg ;echo aacacgaactttaacacg ) |
perl -ne '# Split input into triplets (A3)
# use each triplet as key in the hash table count
# and increase the value for the key
map { $count{$_}++ } unpack("(A3)*",$_);
# When we are at the end of the file
END{
# Remove the key "" (which is wrong)
delete $count{""};
# For each key: Print key, count
print map { "$_ $count{$_}\n" } keys %count
}'
답변3
약간 장황한 awk
버전
awk 'BEGINFILE{print FILENAME; delete codon}
ENDFILE {
if (NR!=1 || NF!=1 || length($0)%3!=0){
print "is broken"}
else{
for (i=1; i<=length($0); i+=3) codon[substr($0,i,3)]++};
for (c in codon) print c, codon[c];
print ""}' file*
이 입력의 경우
파일 1: 확인
aacacgaactttaacacg
파일 2: 공간
aacacgaact ttaacacg
파일 3: 개행 문자
aacacgaact
ttaacacg
file4: 3개 염기의 배수가 아님
aacacgaactttaacac
당신은 얻는다
file1
aac 3
ttt 1
acg 2
file2
is broken
file3
is broken
file4
is broken
파일을 복구하고 싶고 file4
파일 cat
이 tr
한쪽 끝에서 전달되거나 awk
예제와 같이 다른 쪽 끝에서 전달되는 것과 같은 것이 없는 경우
<<< $(cat file[1..3] | tr -d "\n ")