Mam więc ciąg, który wygląda tak:
AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA
Chcę podzielić ciąg na 3-znakowe fragmenty rozdzielone znakiem „+”.
AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UGA
I chcę to zrobić z moim dobrym przyjacielem sed
.
próbowałem
cat codons | sed -r 's/([A-Z]\{3\})/\1\+/g'
... bez powodzenia.
Jakiego sed
polecenia mogę użyć?
text-processing
sed
ixtmixilix
źródło
źródło
Odpowiedzi:
Ponieważ nie chcesz końcowego
+
, możesz:Oznacza to, foldże linie na idth 3postaci wi pastete 3 linie znaków wraz z nimi selfami +jako delimiterem, co w rzeczywistości przypomina zmianę każdego znaku nowej linii oprócz ostatniej na znak
+
. Jeśli dane wejściowe miały więcej niż jedną linię, skończysz z tymi liniami połączonymi z,+
które mogą, ale nie muszą być tym, czego chcesz.Jeśli potrzebujesz
sed
, możesz usunąć końcowe+
po:źródło
+$
dopasowuje symbol plus bezpośrednio przed końcem linii.fold -w3
dzieli ciąg na 3 linie znaków.paste -sd+ -
zamienia nowe linie w+
.aby zacząć działać, nie musisz uciekać od
{}
symboli:źródło
To może Ci pomóc (GNU sed):
źródło
Jeśli sed nie jest koniecznością, użycie Ruby może być alternatywą. Interpretator Ruby
ruby
, może być używany jak sed i awk, uruchamiając go z-n
opcją, która powoduje iterację po wprowadzonych danych. Tłumacz może być następnie zasilany jednowierszowym Ruby, dodając go jako argument do-e
opcji (która mówi tłumaczowi, aby zinterpretował argument-e
zamiast szukać skryptu w pliku).W przypadku tego konkretnego problemu można użyć następującego linka (dostosowanego z https://stackoverflow.com/a/3184271/789593 ):
W prostym języku to
scan(/.{3}|.+/)
w ciągu wejściowym,$_
(w tym przypadku oczekuje się, że dane wejściowe będą pochodzić ze standardowego wejścia) i umieszcza każde dopasowanie w tablicy,join("+")
,puts
.Na przykład
Zauważ, że nie dodaje końcowego „+”.
źródło