다음과 같이 fasta 파일에서 무작위로 200개의 시퀀스를 빼는 데 도움을 받았습니다.
JQ086372.1 장내세균 파지 HK446, 완전한 게놈 ATGGCAGATAACGAATCCGTTCCGACAGTTCGGCGGCAGCGGTTCAGGCCATGAAAAAATGCAGCTGTGG CTTCCCGCTTCAGTCTGCCAATATGGATGTGAAACTCGTCGGAAAAAAAGTGGTTTATCGCTATCAACGCAACAGCGAATACCCGACTTTTCGCAGAAAGAGATTTTTCACCTTAAA GGCTTCGGATTCACCGGGC TTG TAGGCCTGTC... (이것은 여전히 더 많은 A, C, G 또는 T에 적용됩니다.)
이것을 사용하십시오 :
< file.fasta tail -n+2 | tr -d '\n' > newfile
이:
n=$(stat -c "%s" newfile)
r=$(shuf -i1-"$((n-200+1))" -n1)
< newfile tail -c+"$r" | head -c200
내가 얻는 결과는 다음과 같습니다.
이제 .fa로 끝나는 여러 파일과 함께 이 스크립트를 사용하고 for 루프를 사용하여 각 파일의 무작위 200개 하위 문자열 출력을 새 파일에 저장하고 싶습니다. 이는 다음과 같은 3개의 .fa 파일이 있는 경우를 의미합니다.
game.fa
sport.fa
food.fa
각 .fa 파일에서 무작위로 200개의 하위 문자열을 생성하고 200개의 하위 문자열 출력만 포함하는 새 파일을 생성하겠습니다.
game_200_subtring.fa
sport_200_substring.fa
food_200_substring.fa
아마 아주 기본적인 내용일 테니 미리 감사드립니다.
답변1
원하는 대로 작동해야 합니다. 스크립트 자체에 사용법 정보를 포함시켰습니다. 참고: 소스 파일에 액세스할 수 없기 때문에 이 스크립트의 출력을 안정적으로 테스트할 수는 없습니다.~해야 한다일하다.
이는 단순히 스크립트가 실행되는 디렉터리의 ".fa" 파일을 반복하고 각 파일에 제공한 스크립트를 실행하여 "output"이라는 하위 디렉터리에 각 파일에 대한 새 파일을 생성합니다.
#!/bin/bash
# Usage:
# Run this script from within the same directory as the .fa files.
# A subdirectory named 'output' will be created, in which every
# input file will have a corresponding output file, prefixed with 'seq.'
mkdir -p ./output
shopt -s nullglob
for f in *.fa
do
nf="./output/seq.$f"
echo "Copying sequence from '$f' to '$nf'"
< $f tail -n+2 | tr -d '\n' > $nf
n="$(stat -c "%s" $nf)"
r="$(shuf -i1-"$((n-200+1))" -n1)"
< $nf tail -c+"$r" | head -c200
done
답변2
기존 단일 파일 코드를 함수에 넣습니다.
random_sample() {
local fasta_file=$1
local n r tmp sample
tmp=$(mktemp)
< "$fasta_file" tail -n+2 | tr -d '\n' > "$tmp"
n=$(stat -c "%s" "$tmp")
r=$(shuf -i1-"$((n-200+1))" -n1)
sample=$(tail -c+"$r" < "$tmp" | head -c200)
rm "$tmp"
printf "%s\n" "$sample"
}
그럼 당신은 할 수 있습니다
for file in *.fa; do
random_sample "$file" > "${file%.fa}_200_substring.fa"
done
fasta 파일이 그다지 크지 않으면 tmp 파일을 사용하지 않습니다.
random_sample() {
local fasta_file=$1
local data n r
data=$(tail -n+2 < "$fasta_file" | tr -d '\n')
n=${#data}
r=$(shuf -i1-"$((n-200+1))" -n1)
tail -c+"$r" <<< "$data" | head -c200
}
파일 < 32767바이트인 경우
random_sample() {
local fasta_file=$1
local data
data=$(tail -n+2 < "$fasta_file" | tr -d '\n')
echo "${data:($RANDOM % ${#data}):200}"
}