使用awk打印标题名称和子字符串

我尝试使用此代码打印基因名称的标题,然后根据其位置提取子字符串,但这不起作用

$VAR1 = {
          'monkey' => [
                        [
                          'monkey','ACB2',70,'230'
                        ],[
                          'monkey','GMSD',234,'GJAS',521,'ASDA',134,'ASMD',700,'230'
                        ]
                      ],'bear' => [
                      [
                        'bear',12,'87'
                      ],[
                        'bear','GASF',131,'SDVS',53,'87'
                      ]
                    ],'snake' => [
                       [
                         'snake','120'
                       ],[
                         'snake','SGJK',183,'KDMFS',1213,'VCS2',21,'120'
                       ]
                     ]
        };

input_file

>output_file
cat input_file | while read row; do
        echo $row > temp
        geneName=`awk '{print $1}' tmp`
        startPos=`awk '{print $2}' tmp`
        endPOs=`awk '{print $3}' tmp`
                for i in temp; do
                echo ">${geneName}" >> genes_fasta ;
                echo "awk '{val=substr($0,${startPos},${endPOs});print val}' fasta" >> genes_fasta
        done
done

fasta

nad5_exon1 250405 250551
nad5_exon2 251490 251884
nad5_exon3 195620 195641
nad5_exon4 154254 155469
nad5_exon5 156319 156548

这是我的错误输出文件

atgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgc............

输出应如下所示:

>
awk '{val=substr(pull_genes.sh,);print val}' unwraped_carm_mt.fasta
>
awk '{val=substr(pull_genes.sh,);print val}' unwraped_carm_mt.fasta
l0123b0123 回答:使用awk打印标题名称和子字符串

您可以通过一次调用awk来做到这一点,这比在shell脚本中循环并每次迭代调用awk进行4次效率高出几个数量级。由于使用了bash,因此可以简单地使用命令替换并将fasta的内容重定向到awk变量,然后仅输出包含开头到结尾的标题和子字符串fasta文件中的字符。

例如:

awk -v fasta=$(<fasta) '{print ">" $1; print substr(fasta,$2,$3-$2+1)}' input

或在getline规则内使用BEGIN

awk 'BEGIN{getline fasta<"fasta"}
{print ">" $1; print substr(fasta,$3-$2+1)}' input

示例输入文件

注意:开始和结束值已减少,以适合示例中的129个字符:

$ cat input
rad5_exon1 1 17
rad5_exon2 23 51
rad5_exon3 110 127
rad5_exon4 38 62
rad5_exon5 59 79

以及示例fasta的前129个字符

$ cat fasta
atgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgcatgc

使用/输出示例

$ awk -v fasta=$(<fasta) '{print ">" $1; print substr(fasta,$3-$2+1)}' input
>rad5_exon1
atgcatgcatgcatgca
>rad5_exon2
gcatgcatgcatgcatgcatgcatgcatg
>rad5_exon3
tgcatgcatgcatgcatg
>rad5_exon4
tgcatgcatgcatgcatgcatgcat
>rad5_exon5
gcatgcatgcatgcatgcatg

仔细研究一下,让我知道我是否理解您的问题要求。如果您对解决方案还有其他疑问,也请告诉我。

,

如果我正确理解,该怎么办?

awk 'NR==FNR {fasta = fasta $0; next}
    {
        printf(">%s %s\n",$1,substr(fasta,$3 - $2 + 1))
    }' fasta input_file > genes_fasta

  • 它首先读取fasta文件,并将序列存储在变量fasta中。
  • 然后,它逐行读取input_file,并提取fasta的子字符串,该子字符串从$2开始,长度为$3 - $2 + 1。 (请注意,substr函数的第三个参数是长度,而不是端点。)

希望这会有所帮助。

,

成功了! 这是用于从Fasta文件中提取子字符串的脚本

cat genes_and_bounderies1 | 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)}' unwraped_${fasta} >> genes_fasta
        done
done
本文链接:https://www.f2er.com/3047629.html

大家都在问