首页 > 解决方案 > 如何在循环中运行 bash 脚本

问题描述

我编写了一个 bash 脚本,以便从两个输入文件中提取子字符串并将其保存到一个输出文件中,如下所示:输入文件 1

>genotype1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

输入文件 2

gene1 10 20
gene2 40 50
genen x y

我的剧本

>output_file

cat input_file2 | while read row; do
    echo $row > temp
    geneName=`awk '{print $1}' temp`
    startPos=`awk '{print $2}' temp`
    endPos=`awk '{print $3}' temp`
    length=$(expr $endPos - $startPos)
    for i in temp; do
        echo ">${geneName}" >> genes_fasta
        awk -v S=$startPos -v L=$length '{print substr($0,S,L)}' input_file1 >> output file

    done
done

我怎样才能使它在输入文件1中的多个字符串的循环中工作?新的输入文件如下所示:

>genotype1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>genotype2
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
>genotypen...
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn...

我希望每个基因型都有一个不同的输出文件,并且文件名将是基因型名称。谢谢你!

标签: bashunixbioinformatics

解决方案


如果我理解正确,您会尝试以下操作:

awk '
FNR==NR {
    name[NR] = $1
    start[NR] = $2
    len[NR] = $3 - $2
    count = NR
    next
}
/^>/ {
    sub(/^>/,"")
    genotype=$0
    next
}
{
    for (i = 1; i <= count; i++) {
        print ">" name[i] > genotype
        print substr($0, start[i], len[i]) >> genotype
    }
    close(genotype)
}' input_file2 input_file1

输入文件1:

>genotype1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>genotype2
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
>genotype3
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

输入文件2:

gene1 10 20
gene2 40 50
gene3 20 25

【结果】
基因型1:

>gene1
aaaaaaaaaa
>gene2
aaaaaaaaaa
>gene3
aaaaa

基因型2:

>gene1
bbbbbbbbbb
>gene2
bbbbbbbbbb
>gene3
bbbbb

基因型3:

>gene1
nnnnnnnnnn
>gene2
nnnnnnnnnn
>gene3
nnnnn

[编辑]
如果要将输出文件存储到不同的目录,请尝试以下操作:

dir="./outdir"  # directory name to store the output files
                # you can modify the name as you want
mkdir -p "$dir"

awk -v dir="$dir" '
FNR==NR {
    name[NR] = $1
    start[NR] = $2
    len[NR] = $3 - $2
    count = NR
    next
}
/^>/ {
    sub(/^>/,"")
    genotype=$0
    next
}
{
    for (i = 1; i <= count; i++) {
        print ">" name[i] > dir"/"genotype
        print substr($0, start[i], len[i]) >> dir"/"genotype
    }
    close(dir"/"genotype)
}' input_file2 input_file1
  • 第一两行在 bash 中执行以定义和 mkdir 目标目录。
  • 然后目录名awk通过-v选项传递给

希望这可以帮助。


推荐阅读