3文字おきに文字を追加するsedワンライナーを作成するにはどうすればよいですか?


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コマンドを使用できますか?


1
これはどういうわけかロザリンドと関係がないのですか?ちょっと興味があるんだけど。
m0nhawk

回答:


16

末尾が不要な+ので、次のようにできます。

fold -w3 | paste -sd+ -

つまり、fold上行3文字wIDTH、およびpasteそれらとそれらの3つの文字行は、sとエルフ+のようにd実際ににすべての改行文字が、最後の1を変更するようなものですelimiter +。入力に複数の行が含まれている場合は、それらの行がa +で結合されたものになり、これが目的のものである場合とそうでない場合があります。

にする必要がsedある場合は、後の末尾を削除できます+

sed 's/.../&+/g;s/+$//'

それがどのように機能するかについての簡単な説明を追加していただけませんか?
NN

@NN行末の+$直前のプラス記号に一致するため、機能します。
Chris Down、

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

0

sedが必須でない場合は、Rubyを使用することをお勧めします。Rubyインタプリタはruby、sedやawkのように-n、入力を反復させるオプションを指定して実行することで使用できます。インタプリタは、-eオプションへの引数として追加することにより、Rubyワンライナーをフィードできます(-eファイル内のスクリプトを探すのではなく、の引数を解釈するようにインタプリタに指示します)。

この特定の問題については、次のワンライナーを使用できます(https://stackoverflow.com/a/3184271/789593から変更)。

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

わかりやすい言葉で

  • scan(/.{3}|.+/)入力文字列内の任意の3文字または少なくとも1文字に一致し$_(この場合、入力は標準入力からのものであると予想されます)、各一致を配列に入れます。
  • 配列を文字列に結合し、各要素を「+」で接続します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

末尾に「+」を追加しないことに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.