Найти, заменить и увеличить при каждом появлении строки - PullRequest
2 голосов
/ 11 июня 2011

Я относительно новичок в написании сценариев и заранее извиняюсь за эту мучительно простую проблему. Я полагаю, что я довольно тщательно искал, но, по-видимому, никакие другие ответы или поваренные книги не были достаточно явными, чтобы я мог понять (например, здесь - все еще не смог получить его)

У меня есть файл, который состоит из цепочек букв (если хотите, ДНК), по одной строке на строку. Над каждой строкой я вставил еще одну строку для идентификации базовой строки. Для тех из вас, кто является биоинформатиками, я пытаюсь составить тестовый набор данных в формате fast, возможно, у вас есть инструменты? В любом случае, я бы поставил отдельное слово, «num», после каждого «>» с намерением использовать инкрементатор bash и sed для создания уникального числа, возглавляющего каждую строку. Например, в data.txt у меня есть ...

> нет, бла, бла, бла

ATCGACTGAATCGA

> нет, бла, бла, бла

ATCGATCGATCGATCG

> нет, бла, бла, бла

ATCGATCGATCGATCG

Я бы хотел, чтобы это было ...

> 0, бла, бла, бла

ATCGACTGAATCGA

> 1, бла, бла, бла

ATCGATCGATCGATCG

> 2, бла, бла, бла

ATCGATCGATCGATCG

Решение может быть на любом языке до тех пор, пока оно завершено и && выполнит работу. У меня есть небольшой опыт работы с sed, awk, bash и c ++ (немного == немного больше, чем никакого опыта). Я знаю, я знаю, мне нужно изучить Perl, но я только начал. Вопрос в следующем: как заменить «num» числом, которое увеличивается при каждой замене? Неважно, если основная строка идентична другой где-то еще. Заранее спасибо за помощь!

Ответы [ 2 ]

8 голосов
/ 11 июня 2011
perl -ple 's/num/$n++/e' filename

пробный прогон 1-й, если это так, то что вы хотите

1 голос
/ 11 июня 2011

Используется замена процесса, которая может быть или не быть доступной в вашей системе.

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
...