2011-06-11 2 views
2

나는 고통스럽고 간단한 문제에 대해 미리 스크립팅을하고 새해에 사과드립니다. 나는 꽤 철저히 검색 한 것으로 믿지만 분명히 다른 대답이나 요리 책이 나에게 충분히 이해되어서는 안된다. (예 : here - 아직도 그것을 얻을 수 없었다.)문자열의 각 항목에서 찾기, 바꾸기 및 증가시키기

나는 한 줄에 한 줄씩 문자의 문자열 (DNA라면 상관 없다)로 구성된 파일을 가지고있다. 각 문자열 위에 기본 문자열을 식별하는 다른 행을 삽입했습니다. 생물 정보 과학자 여러분을 위해 저는 fasta 형식의 테스트 데이터 세트를 만들려고합니다. 어쩌면 도구가 있을까요? 어쨌든, 나는 각각의 ">"뒤에 별개의 단어 인 "num"을 넣을 것입니다. bash incrementer와 sed를 사용하여 각 문자열의 고유 번호를 생성하려고합니다. 예를 들어, data.txt로, 나는 ...

> NUM, 어쩌구 저쩌구

ATCGACTGAATCGA

> NUM, 어쩌구 저쩌구

ATCGATCGATCGATCG

> NUM, ㅋ 저쩌구

ATCGATCGATCGATCG

,

나는 그것이 싶습니다 ...

> 0, 어쩌구 저쩌구

ATCGACTGAATCGA

> 1, ㅋ, ㅋ, ㅋ ㅋ

ATCGATCGATCGATCG

> 2, blah, blah, blah

ATCGATCGATCGATCG

이 솔루션은 한가 & &이 일을 얻을 전체의로 어떤 언어로 할 수있다. 나는 sed, awk, bash 및 C++ (경험이없는 것보다 약간 작은 것)에 약간의 경험이 있습니다. 나도 알아, 나도 알아, 나는 펄을 배울 필요가 있지만, 방금 시작했다. 문제는 다음과 같습니다. "num"을 각 교체에서 증가하는 숫자로 바꾸는 방법은 무엇입니까? 기본 문자열이 다른 곳의 다른 문자열과 동일한 지 여부는 중요하지 않습니다. 미리 도움을 주셔서 감사합니다! 그것은 그렇게 할 경우

+0

주제에서 완전히 제외되었지만 [Haskell] (http://www.haskell.org/haskellwiki/Applications_and_libraries)를 확인하십시오. –

+0

예를 들어 [Genet programming] (http://www.haskell.org/haskellwiki/Applications_and_libraries/Genetic_programming). –

+0

Sed는 여기에서 사용할 도구가 아닙니다. 당신은 원하는 방식으로 sed와 bash를 결합 할 수 없습니다. Emacs 나 Vim에서 편집기 매크로를 쓰는 것이 sed + bash에서하는 것보다 쉽습니다. (그래도 Awk는 효과가있다.) 내가 말했듯이, 진정한 편집인조차도 효과가있을 것이다. 몇 가지 도구를 탐색하고 학습을 시작해야합니다.거의 모든 것이 아무것도없는 것보다 낫습니다. - 너는 아마 모든 "숫자"줄을 손으로 썼을거야, 그렇지? – yam655

답변

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

드라 1 일, 당신이

+0

+1은 Perl 1-liners를 좋아해야합니다! –

+0

완벽하게 일했습니다! 정확히 내가 무엇을 찾고 있었는지! – vincent

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

+0

i는 0으로 시작하지만 i = $ ((i + 1))로 증가하고 루프 이후의 값은 다른 값으로 설정되거나 설정 해제 될 때까지 유지됩니다. –

+0

쿨! 이 물건은 훌륭합니다. 참고 : 인생이 멋지다. 그것을 유지하고 행운을 비네! – vincent