我得到了帮助,从 fasta 文件中减去随机 200 序列,如下所示:
JQ086372.1 肠杆菌噬菌体 HK446,全基因组 ATGGCAGATAAACGAATCCGTTCCGACAGTTCGGCGGCAGCGGTTCAGGCCATGAAAAATGCAGCTGTGG CTTCTCCCGCTTCAGTCTGCCAATATGGATGTGAAACTCGTCGGAAAAAAAGTGGTTTATCGCTATCAACGCAACAGCGAATACCCGACTTTTCGCAGAAAGAGATTTTTCACCTTAAAGGCTTCGGATTCACCGGGC TTGTAGGCCTGTC...(这仍然适用于更多的 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
作为输出,我得到: GTTAAGGGCGCCGTTCTGCTTGTCTTTGCTGACATGTTTGAACACCGGACGGCACAAAGCGAAGTGCAGCTTTATGAGAATGCAGCCGCCGAACGCATGATGTTCATTCATCGCAACTGGCGCGGTAAATCTGAACCTGAGGAGGGCTCCTGATGGAACCTGGACGATTCAGGCACAGGGTAAAAATTCTCACCTTCACG
现在,我希望使用 for 循环,将此脚本用于以 .fa 结尾的多个文件,并将每个文件的每个随机 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}"
}