множественный sed с -e и escape-символами - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь сделать несколько замен в сжатом файле и у меня возникли проблемы.

zcat PteBra.fa.align.gz | sed -e 's#Simple_repeat/Satellite/Y-chromosome#Simple_repeat/Satellite#g' -e sed 's#Unknown/Unknown/Y-chromosome#Unknown/Unknown#g' -e sed 's#DNA/DNA/TcMar#DNA/TcMar#g' -e sed 's#DNA/DNA/Crypton#DNA/Crypton#g' -e sed 's#DNA/DNA/PIF-Harbinger#DNA/PIF-Harbinger#g' -e sed 's#DNA/DNA/CMC-Chapaev-3#DNA/CMC-Chapaev-3#g' -e sed 's#SINE/SINE/RTE#SINE/RTE#g' > PteBra.fa.align.corrected

Обратите внимание, что я использую # вместо стандартного / из-за присутствия / в текст я хочу заменить. Каждый отдельный sed работает без проблем, но их объединение приводит к этой постоянной ошибке:

sed: -e expression #2, char 3: unterminated `s' command

Я искал решение, но, наконец, чтобы выполнить работу, просто выполнил все sed в отдельности. Это занимает НАВСЕГДА, поэтому я бы хотел, чтобы эта опция работала.

Я занимаюсь этим часами и буду признателен за помощь.

Что я делаю не так?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2020

Вам не нужно каждый раз писать -e sed! -e подойдет.

zcat PteBra.fa.align.gz | sed -e 's#Simple_repeat/Satellite/Y-chromosome#Simple_repeat/Satellite#g' -e 's#Unknown/Unknown/Y-chromosome#Unknown/Unknown#g' -e 's#DNA/DNA/TcMar#DNA/TcMar#g' -e 's#DNA/DNA/Crypton#DNA/Crypton#g' -e 's#DNA/DNA/PIF-Harbinger#DNA/PIF-Harbinger#g' -e 's#DNA/DNA/CMC-Chapaev-3#DNA/CMC-Chapaev-3#g' -e 's#SINE/SINE/RTE#SINE/RTE#g' > PteBra.fa.align.corrected

или вы можете использовать точку с запятой внутри самого выражения sed string

zcat PteBra.fa.align.gz | sed -e '
s#Simple_repeat/Satellite/Y-chromosome#Simple_repeat/Satellite#g;
s#Unknown/Unknown/Y-chromosome#Unknown/Unknown#g;
s#DNA/DNA/TcMar#DNA/TcMar#g;
s#DNA/DNA/Crypton#DNA/Crypton#g;
s#DNA/DNA/PIF-Harbinger#DNA/PIF-Harbinger#g; 
s#DNA/DNA/CMC-Chapaev-3#DNA/CMC-Chapaev-3#g;
s#SINE/SINE/RTE#SINE/RTE#g
' > PteBra.fa.align.corrected
0 голосов
/ 03 февраля 2020

Поскольку у вас уже есть правильный ответ, это не очередной ответ, а небольшое предложение для фактической операции.
Я думаю, что написание команды sed в строке может быть грязной работой. Как насчет подготовки справочной таблицы, которая описывает замену и заменитель в строке в формате csv, например:

table.txt

Simple_repeat/Satellite/Y-chromosome,Simple_repeat/Satellite
Unknown/Unknown/Y-chromosome,Unknown/Unknown
DNA/DNA/TcMar,DNA/TcMar
DNA/DNA/Crypton,DNA/Crypton
DNA/DNA/PIF-Harbinger,DNA/PIF-Harbinger
DNA/DNA/CMC-Chapaev-3,DNA/CMC-Chapaev-3
SINE/SINE/RTE,SINE/RTE

Тогда вы может выполнить следующий скрипт awk для замены строк:

zcat PteBra.fa.align.gz | awk -F, '
    NR==FNR {repl[$1] = $2; next}
    {
        for (r in repl) gsub(r, repl[r])
        print
    }
' table.txt - > PteBra.fa.align.corrected

Надеюсь, это поможет.

...