मैं हर तीसरे चरित्र के बाद एक चरित्र जोड़ने के लिए एक सेड वन लाइनर कैसे लिखूं?


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 वर्ण रेखाएं उनके साथ समाप्त होती हैं जो कि अमृत ​​के रूप में होती हैं जो वास्तव में हर नई रेखा के चरित्र को बदलने की तरह है लेकिन अंतिम एक में । यदि इनपुट में एक से अधिक लाइन थी, तो आप उन लाइनों के साथ समाप्त हो जाएंगे, जो आप चाहते हैं या नहीं हो सकता है।3wpastes+d++

यदि आपको इसकी आवश्यकता है sed, तो आप इसके +बाद की ट्रेलिंग को हटा सकते हैं :

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

क्या आप समझेंगे कि यह कैसे काम करता है?
एनएन

@ एनएन यह काम करता है क्योंकि +$एक पंक्ति के अंत से तुरंत पहले एक प्लस प्रतीक से मेल खाता है।
क्रिस डाउन

fold -w3स्ट्रिंग को 3 वर्ण रेखाओं में विभाजित करता है। paste -sd+ -में newlines बदल जाता है +
bahamat

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

अपने तरीके से काम करने के लिए आपको {}प्रतीकों से बचने की आवश्यकता नहीं है :

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

1
कौन जानता था! मैं अब तक बहुत करीब था ... धन्यवाद ...
ixtmixilix

दोनों एक अनुगामी '+' जोड़ते हैं। क्या यह इरादा है?
एनएन

2

यह आपके लिए काम कर सकता है (GNU sed):

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

0

अगर sed नहीं है तो रूबी का उपयोग करना एक विकल्प नहीं हो सकता है। रूबी दुभाषिया, को rubyसीड की तरह इस्तेमाल किया जा सकता है और इसे -nविकल्प के साथ चलाकर जगाया जा सकता है, जो इसके इनपुट पर पुनरावृति करता है। दुभाषिया को तब -eविकल्प के तर्क के रूप में जोड़कर रूबी एक-लाइनर के साथ खिलाया जा सकता है (जो दुभाषिया को -eकिसी फ़ाइल में स्क्रिप्ट की तलाश करने के बजाय तर्क की व्याख्या करने के लिए कहता है )।

इस विशेष समस्या के लिए आप निम्नलिखित एक-लाइनर ( https://stackoverflow.com/a/3184271/7/7593 से अनुकूलित) का उपयोग कर सकते हैं ) का :

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

सादे भाषा में इसे

  • किसी भी 3 वर्ण या कम से कम एक वर्ण से मेल खाता है, scan(/.{3}|.+/) इनपुट स्ट्रिंग में, $_(इस मामले में इनपुट मानक से आने की उम्मीद है) और प्रत्येक मैच को एक सरणी में रखता है;
  • सरणी को प्रत्येक तत्व से जोड़ने वाले '+' के साथ एक स्ट्रिंग में जोड़ता है 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

ध्यान दें कि इसमें कोई अनुगामी '+' नहीं जोड़ा गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.