AWK для замены символов в строках, не начинающихся с ">"

taskset -c 1-3./a.out arg1 arg2

запускает процесс a.outс заданными аргументами и привязкой к процессорам 1, 2 или 3 (на основе нуля ).

Вот минимальная тестовая программа на C, которую можно использовать, чтобы увидеть ее в действии:https://stackoverflow.com/questions/10490756/how-to-use-sched-getaffinity-and-sched-setaffinity-in-linux-from-c/50117787#50117787

5
28.04.2020, 10:34
5 ответов

Вы можете попробовать:

awk '!/^>/ { gsub(/\./, "X") }1' Sfr.pep > Sfr2.pep

Выход:

>sequence.1
GTCAGTCAGTCAXGTCAGTCA
9
19.03.2021, 02:26

Кажется более естественным сделать это с помощьюsed:

sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep

Это будет соответствовать ^>текущей строке ("эта строка начинается с символа >?" ). Если это выражение не совпадает с и , команда yиспользуется для замены каждой точки в этой строке на X.

Тестирование:

$ cat Sfr.pep
>sequence.1
GTCAGTCAGTCA.GTCAGTCA
$ sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep
$ cat Sfr2.pep
>sequence.1
GTCAGTCAGTCAXGTCAGTCA

Основная проблема с вашим кодом awkзаключается в том, что nextвыполняется всякий раз, когда вы встречаете строку заголовка fasta. Это означает, что ваш код создает только данные последовательности без заголовков. Эти данные последовательности должны выглядеть нормально, но это не сильно поможет.

Простое отрицание теста и удаление блока next(или предшествующий nextблокprint)решит проблему в awkдля вас, но, и это мое личное мнение, использование yв sedболее элегантна, чем использованиеgsub()(или s///gвsed)для транслитерации отдельных символов.

11
19.03.2021, 02:26

Вы не печатаете строки, начинающиеся с >, вы печатаете только строки, в которых вы выполняете замену. Используйте команду printдля печати перед переходом к следующей строке.

awk '/^>/ {print;next} {gsub(/\./,"X")}1' Sfr.pep > Sfr2.pep
2
19.03.2021, 02:26

Использование Raku (урожденного Perl _6 )и/или Perl:

raku -pe 's:g/^^ <-[>]>  <-[.]>*?  <(\.)> /X/;'

ИЛИ (может быть более читаемым):

raku -pe 's:g{ ^^ <-[>]>  <-[.]>*?  <(\.)> } = Q{X};'

Raku вызывается из командной строки оболочки с флагами автопечати -pe. Оператор подстановки места s///в -используется здесь в двух видах. Первый — классический, а второй — обновленная Raku идиома Perl (5 )s{...}{...};.

Вкратце, читая атомы слева от -до -справа, "поиск, начиная с ^^начала -строки -и где <-[>]>нет отдельного символа ">" найдено, то там, где <-[.]>*?не -жадно не найден литерал нуля -или -больше ".", если затем найден <(\.)>литерал ".", отбросить все совпадения до/после и заменить эти «.» с «X»; сделайте это глобально, построчно, автоматически печатая все строки с заменой (s ), как описано.

Говоря о родословной Perl5, вот как вы могли бы сделать P5родственным второму примеру Raku выше (, но флаг командной строки -pEможет быть лучше в более старых установках):

perl -pe 's{^ [^>]  [^.]*?  \K\. }{X}gx;'

(Особая благодарность @Sinan Ünür за руководство P5, ссылка ниже ).

https://stackoverflow.com/a/15578028/7270649
https://stackoverflow.com/a/24542792/7270649
https://docs.raku.org/language/operators#s///_in-place_substitution
https://raku.org/

0
18.09.2021, 21:36
#!/usr/bin/python
import re
g=re.compile(r'^>')
rep=re.compile(r'\.')
k=open('file','r')
for b in k:
    if not re.search(g,b):
        er=re.sub(rep,"X",b)
        print er.strip()
    else:
        print b.strip()

выход

>sequence.1
GTCAGTCAGTCAXGTCAGTCA
0
20.09.2021, 19:32

Теги

Похожие вопросы