2011-06-11 80 views
2

对于这个非常简单的问题,我对脚本编程相对陌生,并且提前道歉。我相信我已经搜索得非常彻底,但显然没有其他答案或食谱书明确足以让我理解(如here - 仍然无法获得)。在每次发生字符串时查找,替换和增加

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

> NUM,胡说,胡说,胡说

ATCGACTGAATCGA

> NUM,胡说,胡说,胡说

ATCGATCGATCGATCG

> NUM,等等,等等,等等

ATCGATCGATCGATCG

我想它是...

> 0,等等,等等,等等

ATCGACTGAATCGA

> 1,胡说,胡说,胡说

ATCGATCGATCGATCG

> 2,blah,blah,blah

ATCGATCGATCGATCG

该解决方案可以在任何语言,只要它是完整的& &能够完成任务。我对sed,awk,bash和C++有一些经验(稍微比没有经验的人略多)。我知道,我知道,我需要学习Perl,但我只是刚刚开始。问题是这样的:如何用每次替换时递增的数字替换“num”?如果底层字符串与别处的另一个字符串相同则无关紧要。感谢您的帮助!

+0

完全(伪)离题,但请检出[Haskell](http://www.haskell.org/haskellwiki/Applications_and_libraries)。 – 2011-06-11 00:06:07

+0

例如,[遗传编程](http://www.haskell.org/haskellwiki/Applications_and_libraries/Genetic_programming)。 – 2011-06-11 00:07:59

+0

Sed不是在这里使用的工具。你不能以你想要的方式组合sed和bash。在Emacs或Vim中编写宏比在sed + bash中编写宏更容易。 (尽管如此,Awk仍然有效。)正如我所说,即使是一个真正的编辑也能工作。你需要探索一些工具并开始学习它们。几乎任何事情都会比没有好。 - 你也许手工写出了所有的“num”行,对吧? – yam655 2011-06-11 00:31:01

回答

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

试运行1,如果是这样做,你想要什么

+0

+1必须爱那些Perl 1行! – 2011-06-11 00:51:02

+0

工作完美!正是我在找什么! – vincent 2011-06-11 03:03:14

1

这使用过程替代,这可能是也可能不是您的系统上。

[email protected]:/tmp$ exec 3< <(cat test.txt) 
[email protected]:/tmp$ i=0 
[email protected]:/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 
+0

这也很完美,谢谢你的回答!它似乎比上面的perl行慢了一点,但我觉得这是一个非常有趣的方式来完成工作!我不知道(但是我猜应该有),你可以从命令行做很多事情。它是否只在运行以下命令之前保持i = 0?如果可以的话,我会投你一票,但我还没有足够的声望(这是我的第一篇文章)。再次感谢! – vincent 2011-06-11 03:25:16

+0

我从0开始,但它随着i = $((i + 1))递增,并且无论它在循环后如何,它都会保持,直到设置为另一个值或取消设置。 – 2011-06-11 03:29:22

+0

酷!这东西太棒了。旁注:你的生活看起来很酷。保持它,祝你好运! – vincent 2011-06-11 03:34:36