【问题标题】:gsub consecutive characters and keep previous linegsub 连续字符并保留上一行
【发布时间】:2016-05-25 12:50:02
【问题描述】:

我有这个输入文件:

>seq
GATGGATTCGGANNNNNNNNNNNNNNNGTTGTAGGGNNNNNNNNNNNNNNNNNNNNNNGATAGAGAGNN
>suq
AAHAHAH

还有这个命令

awk '{gsub(/[N]{5,}/,"\n")}1' f.fa

当前输出

>seq
GATGGATTCGGA
GTTGTAGGG
GATAGAGAGNN
>suq
AAHAHAH

如果找到 5 个或更多连续的 'N'-s,则字符串将被分隔到另一行。问题是我希望输出是这样的:

>seq
GATGGATTCGGA
>seq_1
GTTGTAGGG
>seq_2
GATAGAGAGNN
>suq
AAHAHAH

在每个换行符之前,我想添加 '>' 行,它对应于字符串加上一个递增的数字(为了每个 '>' 行都是唯一的)。我一直在尝试不同的方法,但没有成功。

【问题讨论】:

  • 如果必须重复,suq 计数会从 1 还是 3 开始(seq 计数停止的地方)?

标签: awk


【解决方案1】:

您已经完成了大部分工作。以下是我的补充:

 awk '$0~/^>/{prev=$0;}
      {gsub(/[N]{5,}/,"\n"prev"_INSERTNUMBER\n");
       for(counter=1;sub(/INSERTNUMBER/,counter++,$0)>0;){}}1' test

产生所需的输出

>seq
GATGGATTCGGA
>seq_1
GTTGTAGGG
>seq_2
GATAGAGAGNN
>suq
AAHAHAH

我添加了什么?
1.用$0~/^>/{prev=$0;}我存储上一行以>开头的内容。
2.然后,我将[N]{5,}替换为\nprev_INSERTNUMBER\n(即\n>seq_INSERTNUMBER\n
3.最后,我们把所有INSERTNUMBERs替换成(1,2,...)

【讨论】:

    【解决方案2】:

    另一个awk

    $ awk -v RS=">" 'NR>1{$0=RS $0; 
                          while(sub(/NNNNN+/, "\n" $1 "_" ++c "\n"));
                          printf "%s",$0}' file
    
    >seq
    GATGGATTCGGA
    >seq_1
    GTTGTAGGG
    >seq_2
    GATAGAGAGNN
    >suq
    AAHAHAH
    

    【讨论】:

    • 你的好解决方案!
    【解决方案3】:
    $ cat tst.awk
    /^>/ { key = $0; next }
    {
        split($0,a,/N{5,}/)
        for (i=1; i in a; i++) {
            print key (i>1 ? "_"i-1 : "") ORS a[i]
        }
    }
    
    $ awk -f tst.awk file
    >seq
    GATGGATTCGGA
    >seq_1
    GTTGTAGGG
    >seq_2
    GATAGAGAGNN
    >suq
    AAHAHAH
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多