ฉันจะเขียนซับหนึ่งซับเพื่อเพิ่มอักขระหลังจากอักขระที่สามทุกตัวได้อย่างไร


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
นี่ไม่เกี่ยวข้องกับRosalindเหรอ? แค่สงสัย.
m0nhawk

คำตอบ:


16

เนื่องจากคุณไม่ต้องการการติดตาม+คุณสามารถทำได้:

fold -w3 | paste -sd+ -

นั่นคือfoldเส้นบน3ตัวอักษรwidth และpasteทั้ง 3 เส้นตัวละครกับพวกเขาsพวกเอลฟ์กับ+เป็นdelimiter ซึ่งมีผลบังคับใช้เป็นเหมือนการเปลี่ยนแปลงทุกตัวอักษรขึ้นบรรทัดใหม่ +แต่สุดท้ายเป็น หากอินพุตมีมากกว่าหนึ่งบรรทัดคุณจะจบลงด้วยบรรทัดเหล่านั้นที่รวมกับบรรทัด+ที่อาจหรืออาจไม่ใช่สิ่งที่คุณต้องการ

หากคุณต้องการให้เป็นsedคุณสามารถลบการติดตาม+หลัง:

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

คุณจะช่วยเพิ่มคำอธิบายสั้น ๆ เกี่ยวกับวิธีการทำงานอย่างไร
NN

@NN มันใช้งานได้เพราะ+$จับคู่กับเครื่องหมายบวกทันทีก่อนถึงจุดสิ้นสุดของบรรทัด
Chris Down

fold -w3แบ่งสตริงออกเป็น 3 บรรทัดอักขระ จะเปิดการขึ้นบรรทัดใหม่เข้าไปpaste -sd+ - +
bahamat

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

ในการทำงานของคุณคุณไม่จำเป็นต้องหลบเลี่ยง{}สัญลักษณ์ต่างๆ:

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

1
ใครจะรู้! ฉันยังอยู่ใกล้มาก ... ขอบคุณ ...
ixtmixilix

ทั้งสองเพิ่มส่วนท้าย '+' สิ่งนี้ตั้งใจหรือไม่
NN


0

หาก sed ไม่ใช่สิ่งที่ต้องใช้ Ruby อาจเป็นทางเลือก ตัวแปล Ruby rubyสามารถใช้งานได้เช่น sed และ awk โดยรันด้วย-nตัวเลือกที่ทำให้มันวนซ้ำไปเรื่อย ๆ ล่ามสามารถป้อนด้วย Ruby one-liner ได้โดยเพิ่มเป็นอาร์กิวเมนต์ใน-eตัวเลือก (ซึ่งบอกให้ล่ามแปลความหมายของอาร์กิวเมนต์-eแทนที่จะมองหาสคริปต์ในไฟล์)

สำหรับปัญหาเฉพาะนี้คุณสามารถใช้หนึ่งซับต่อไปนี้ (ดัดแปลงจากhttps://stackoverflow.com/a/3184271/789593 ):

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

โปรดทราบว่าจะไม่เพิ่มส่วนท้าย '+' ใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.