Her üç karakterden sonra bir karakter eklemek için sed bir liner nasıl yazabilirim?


10

Yani, şöyle bir dize var:

AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA

Ve dizeyi '+' işareti ile ayrılmış 3 karakterlik parçalara bölmek istiyorum.

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

Ve bunu iyi arkadaşımla yapmak istiyorum sed.

denedim

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

... başarılı olamadı.

Hangi sedkomutu kullanabilirim?


1
Bu bir şekilde Rosalind ile bağlantılı değil mi ? Sadece merak.
m0nhawk

Yanıtlar:


16

Bir iz istemediğiniz için +şunları yapabilirsiniz:

fold -w3 | paste -sd+ -

Olduğunu, foldçizgiler 3karakter wIDþ ve pasteonlarla o 3 karakter çizgileri sile elfler +olarak dyürürlükte her satır karakteri ama içine sonuncusu değişen gibidir elimiter +. Girdinin birden fazla satırı varsa, bu satırla birleştirilen ve istediğiniz satır +olabilir.

Olmanız gerekiyorsa sed, sondaki şemayı kaldırabilirsiniz +:

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

Bunun nasıl çalıştığına dair kısa bir açıklama eklemek ister misiniz?
NN

@NN Çalışır, çünkü +$bir satırın sonundan hemen önce artı işaretiyle eşleşir.
Chris Down

fold -w3dizeyi 3 karakter satırına böler. paste -sd+ -yeni satırları dönüştürür +.
bahamat

12
sed 's/.../&+/g'

yolunuzu çalıştırmak için {}sembollerden kaçmanıza gerek yok :

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

1
kim biliyordu! henüz çok
yakındım

Her ikisi de sonda bir '+' ekler. Bu amaçlandı mı?
NN

2

Bu sizin için işe yarayabilir (GNU sed):

sed 's/...\B/&+/g' file

0

Sed bir zorunluluk değilse Ruby kullanmak bir alternatif olabilir. Ruby yorumlayıcısı, girişi üzerinden yineleme yapan seçenekle rubyçalıştırarak sed ve awk gibi kullanılabilir -n. Daha sonra yorumlayıcı, bir -eseçeneğe argüman olarak ekleyerek Ruby bir astarla beslenebilir (bu, yorumlayıcıya -ebir dosyada komut dosyası aramak yerine argümanını yorumlamasını söyler ).

Bu özel sorun için aşağıdaki tek astarı kullanabilirsiniz ( https://stackoverflow.com/a/3184271/789593 adresinden uyarlanmıştır ):

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

Düz dilde

  • scan(/.{3}|.+/)giriş dizesinde 3 karakterle veya en az bir karakterle eşleşir $_(bu durumda girişin standart girişten gelmesi beklenir) ve her eşleşmeyi bir diziye koyar,
  • diziyi her bir öğeyi bağlayan '+' ile bir dizeye ekler join("+"),
  • ve bir satırsonu tarafından sonlandırıldığını yazdırır puts.

Örneğin

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

Herhangi bir sondaki '+' eklemediğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.