在每次出现字符串时查找,替换和增加

时间:2011-06-11 00:01:18

标签: bash replace sed increment bioinformatics

对于这个痛苦的简单问题,我对脚本相对较新,并提前道歉。我相信我的搜索非常彻底,但显然没有其他答案或烹饪书明确让我理解(如here - 仍然无法得到它)。

我有一个由字母串组成的文件(DNA,如果你关心的话),每行一个字符串。在每个字符串上方,我插入了另一行来标识基础字符串。对于那些生物信息学家,我正在尝试用fasta格式编写测试数据集,也许你有工具?无论如何,我会在每个“>”之后加上一个明确的单词“num”。打算使用bash增量器和sed为每个字符串创建一个唯一的数字。例如,在data.txt中,我有......

  

> num,blah,blah,blah

     

ATCGACTGAATCGA

     

> num,blah,blah,blah

     

ATCGATCGATCGATCG

     

> num,blah,blah,blah

     

ATCGATCGATCGATCG

我希望它是......

  

> 0,blah,blah,blah

     

ATCGACTGAATCGA

     

> 1,blah,blah,blah

     

ATCGATCGATCGATCG

     

> 2,blah,blah,blah

     

ATCGATCGATCGATCG

解决方案可以是任何语言,只要它是完整的&&完成工作。我对sed,awk,bash和c ++有一点经验(小= =略高于没有经验)。我知道,我知道,我需要学习perl,但我才刚开始。问题是:如何将“num”替换为每次替换时增加的数字?如果底层字符串与其他字符串相同则无关紧要。感谢您的帮助!

2 个答案:

答案 0 :(得分:8)

perl -ple 's/num/$n++/e' filename

干跑1号,如果这样做,你想要什么

答案 1 :(得分:1)

这使用了流程替换,您的系统可能会也可能不会。

jcomeau@intrepid:/tmp$ exec 3< <(cat test.txt)
jcomeau@intrepid:/tmp$ i=0
jcomeau@intrepid:/tmp$ while read -u 3 first_word the_rest; do
 if [ "$first_word" == ">num," ]; then
 echo ">$i," $the_rest; i=$((i + 1)); else
 echo $first_word $the_rest; fi; done
>0, blah, blah, blah

ATCGACTGAATCGA

>1, blah, blah, blah

ATCGATCGATCGATCG

>2, blah, blah, blah

ATCGATCGATCGATCG