如何使用 for 循环将脚本的输出保存到单个文件中

如何使用 for 循环将脚本的输出保存到单个文件中

我得到了帮助,从 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

可能它非常基本,所以提前致谢

参考:如何从fasta文件中随机提取200个字符的子字符串

答案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}"
}

相关内容