Как мне написать однострочник для добавления символа после каждого третьего символа?

10

Итак, у меня есть строка, которая выглядит следующим образом:

AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA

И я хочу разбить строку на 3-символьные куски, разделенные знаком «+».

AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UGA

И я хочу сделать это с моим хорошим другом sed.

Я старался

cat codons | sed -r 's/([A-Z]\{3\})/\1\+/g'

... безуспешно

Какую sedкоманду я могу использовать?

ixtmixilix
источник
1
Разве это не связано с Розалиндой ? Просто любопытно.
m0nhawk

Ответы:

16

Так как вы не хотите трейлинг +, вы можете сделать:

fold -w3 | paste -sd+ -

То есть, foldлинии на 3характер wIDþ, и pasteэти 3 строки символов с ними sэльфы с +как delimiter , который в действительности является , как меняется каждый символ новой строки , но последний в +. Если у ввода было более одной строки, вы получите те строки, которые соединены с, +что может или не может быть тем, что вы хотите.

Если вам это нужно sed, вы можете удалить трейлинг +после:

sed 's/.../&+/g;s/+$//'
Стефан Шазелас
источник
Не могли бы вы добавить краткое объяснение того, как это работает?
NN
@NN Это работает, потому что +$соответствует символу плюса непосредственно перед концом строки.
Крис Даун
fold -w3разбивает строку на 3 строки символов. paste -sd+ -превращает в новой строки +.
Багамат
12
sed 's/.../&+/g'

чтобы работать, вам не нужно экранировать {}символы:

sed -r 's/([A-Z]{3})/\1+/g'
порыв
источник
1
кто знал! я был так близко, но так далеко ... спасибо ...
ixtmixilix
Оба добавляют завершающий «+». Это предназначено?
NN
2

Это может работать для вас (GNU sed):

sed 's/...\B/&+/g' file
Potong
источник
0

Если sed не является обязательным, использование Ruby может быть альтернативой. Интерпретатор Ruby ruby, можно использовать как sed и awk, запустив его с -nопцией, которая заставляет его перебирать свой ввод. Затем интерпретатор может быть передан с помощью однострочной строки Ruby, добавив его в качестве аргумента в -eопцию (которая говорит интерпретатору интерпретировать аргумент, -eа не искать скрипт в файле).

Для этой конкретной проблемы вы можете использовать следующую однострочную строку (адаптировано с https://stackoverflow.com/a/3184271/789593 ):

ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'

На простом языке это

  • соответствует любым 3 символам или по крайней мере одному символу scan(/.{3}|.+/)во входной строке $_(в этом случае ожидается, что ввод поступит из стандарта in) и помещает каждое совпадение в массив,
  • объединяет массив в строку с символом «+», соединяющим каждый элемент join("+"),
  • и печатает его завершается переводом строки puts.

Например

echo "AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUG" | ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'
AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UG

Обратите внимание, что он не добавляет завершающий символ «+».

Н.Н.
источник