だから、次のような文字列があります。
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
末尾が欲しくないので、+
次のようにすることができます。
fold -w3 | paste -sd+ -
つまり、fold文字IDの行と区切り文字でスプライトを持つ3つの文字行は、事実上最後の行を除くすべての改行をに変更するのと同じです。入力に複数の行がある場合、この行は次のように関連付けられます。 a 、あなたが望むものであってもなくてもよい。3wpastes+d+
+
本当に必要な場合は、sed
末尾を削除できます+
。
sed 's/.../&+/g;s/+$//'
答え2
sed 's/.../&+/g'
{}
作業中にシンボルをエスケープする必要はありません。
sed -r 's/([A-Z]{3})/\1+/g'
答え3
これはあなたに役立ちます(GNU sed):
sed 's/...\B/&+/g' file
答え4
sed が不要な場合は、Ruby を使用することが代替手段となります。 Rubyインタプリタは、入力を繰り返すオプションを使用して実行し、ruby
sedやawkのように使用できます。-n
次に、Ruby one-linerをオプションに引数として追加してインタプリタに渡すことができます(ファイル内のスクリプトを見つけるのではなく、インタプリタに-e
解釈する内容を教えてください)。-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
末尾の「+」は追加されません。