Как добавить номер в каждый заголовок, уникальный для каждого файла в каталоге? - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть каталог из сотен файлов multi-FASTA.

В каждом заголовке файла используется та же логика именования, например:

>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]

, где:

> - это начало каждого заголовка

Bubo_bubo - это название вида (оно совпадает с именем файла FASTA, здесь: Bubo_bubo.fasta)

c5_g1_i1 - это спецификация последовательности, а все остальные символы - дополнительная информация о конкретной последовательности

Я хочу добавить один и тот же номер к каждому заголовку в определенном файле,между названием вида и другой информацией об этом файле, например:

>Bubo_bubo_001_c5_g1_i1 len=168 path=[174:0-148 24:148-168]

Я хочу, чтобы это число было разным для каждого файла.Не могли бы вы помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вот один из способов использования Perl

Входные файлы

$ ls -1 Bubo_bubo*fasta
Bubo_bubo.fasta
Bubo_bubo2.fasta
Bubo_bubo3.fasta
Bubo_bubo4.fasta

$ cat Bubo_bubo.fasta
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
a b c

$ cat Bubo_bubo2.fasta
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
d e f

$ cat Bubo_bubo3.fasta
>Bubo_bubo3_chihoig len=134 path=[174:0-148 24:148-168]
g h i

$ cat Bubo_bubo4.fasta
>Bubo_bubo4_wrwklk_gjf len-133 path=[174:0-148 24:148-168]
p q r

Решение:

Perl -i заменяет все файлы на месте.

$ perl -i.bak -pe ' if($.==1) { $y=sprintf("%03d",++$x); s/^>((.+?)_(.+?))_/>\1_${y}_/ } close(ARGV) if eof ' Bubo_bubo*fasta

Вывод:

$ cat Bubo_bubo.fasta
>Bubo_bubo_001_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
a b c

$ cat Bubo_bubo2.fasta
>Bubo_bubo_002_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
d e f

$ cat Bubo_bubo3.fasta
>Bubo_bubo3_003_chihoig len=134 path=[174:0-148 24:148-168]
g h i

$ cat Bubo_bubo4.fasta
>Bubo_bubo4_004_wrwklk_gjf len-133 path=[174:0-148 24:148-168]
p q r
0 голосов
/ 15 декабря 2018

Это немного многословно, но я думаю, что это сделает работу:

awk 'BEGIN{FS="_"}filename!=FILENAME{++uniquenumber;filename=FILENAME}/^>/{printf "%s_%s_%03d_%s_%s_%s\n", $1,$2,uniquenumber,$3,$4,$5 > FILENAME"_updated";next}{print $0 > FILENAME"_updated"}' *

Это будет:

  1. Перед обработкой (BEGIN{}) установить разделитель полейЧтобы подчеркнуть.
  2. Если переменная filename не равна текущему файлу, который мы обрабатываем FILENAME, тогда увеличьте переменную uniquenumber на 1 и установите переменную filename в текущее имя файла, которым мы являемсяprocessign FILENAME
  3. Если строка начинается с > (/^>/)
  4. Затем распечатайте строку, добавив уникальный номер, добавленный к трем символам, используя начальные 0: (printf "%s_%s_%03d_%s_%s_%s\n", $1,$2,uniquenumber,$3,$4,$5)
  5. Перенаправить с выводом того же имени файла, но с суффиксом _updated (теперь у вас будет новый файл с изменением. И перейти к следующей строке в файле (> FILENAME"_updated";next)
  6. Если вы все еще здесь, мы находимся на обычной линии. Просто распечатайте его в тот же файл _updated: {print $0 > FILENAME"_updated"}
  7. Сделайте это для всех файлов в этом каталоге *

Пример:

~/fasta$ ls
file1  file2  file3
~/fasta$ cat *
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
blah
blah
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
blah
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
foo
bar
foo
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
foo
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]

_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
whatevfs
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
asd
>Bubo_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
~/fasta$ awk 'BEGIN{FS="_"}filename!=FILENAME{++uniquenumber;filename=FILENAME}/^>/{printf "%s_%s_%03d_%s_%s_%s\n", $1,$2,uniquenumber,$3,$4,$5 > FILENAME"_updated";next}{print $0 > FILENAME"_updated"}' file*
~/fasta$ cat *updated
>Bubo_bubo_001_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
blah
blah
>Bubo_bubo_001_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
blah
>Bubo_bubo_002_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
foo
bar
foo
>Bubo_bubo_002_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
foo
>Bubo_bubo_002_c5_g1_i1 len=168 path=[174:0-148 24:148-168]

_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
whatevfs
>Bubo_bubo_003_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
asd
>Bubo_bubo_003_c5_g1_i1 len=168 path=[174:0-148 24:148-168]
...