Làm thế nào để tôi viết một sed-liner để thêm một ký tự sau mỗi ký tự thứ ba?


10

Vì vậy, tôi có một chuỗi trông như thế này:

AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA

Và tôi muốn chia chuỗi thành các đoạn có 3 ký tự được phân cách bằng dấu '+'.

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

Và tôi muốn làm điều đó với người bạn tốt của tôi sed.

Tôi đã thử

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

... không thành công.

Tôi sedcó thể sử dụng lệnh nào?


1
Đây không phải là bằng cách nào đó kết nối với Rosalind ? Chỉ tò mò thôi.
m0nhawk

Câu trả lời:


16

Vì bạn không muốn theo dõi +, bạn có thể làm:

fold -w3 | paste -sd+ -

Đó là, foldcác dòng trên 3nhân vật width, và pastenhững 3 dòng nhân vật với họ sElves với +như delimiter mà trên thực tế là như thay đổi mỗi kí tự xuống dòng nhưng người cuối cùng thành một +. Nếu đầu vào có nhiều hơn một dòng, bạn sẽ kết thúc với những dòng được nối với một dòng +có thể hoặc không thể là những gì bạn muốn.

Nếu bạn cần nó sed, bạn có thể xóa dấu +sau:

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

Bạn có phiền khi thêm một lời giải thích ngắn về cách thức hoạt động?
NN

@NN Nó hoạt động vì +$khớp với một biểu tượng dấu cộng ngay trước khi kết thúc một dòng.
Chris Xuống

fold -w3ngắt chuỗi thành 3 dòng ký tự. paste -sd+ -biến các dòng mới thành +.
bahamat

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

để làm việc theo cách của bạn, bạn không cần phải thoát {}các biểu tượng:

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

1
Ai biết! tôi đã ở rất gần nhưng cho đến nay ... cảm ơn ...
ixtmixilix

Cả hai thêm một dấu '+'. Đây có phải là dự định?
NN

2

Điều này có thể làm việc cho bạn (GNU sed):

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

0

Nếu sed không bắt buộc phải sử dụng Ruby có thể là một sự thay thế. Trình thông dịch Ruby ruby, có thể được sử dụng như sed và awk bằng cách chạy nó với -ntùy chọn làm cho nó lặp lại trên đầu vào của nó. Trình thông dịch sau đó có thể được cung cấp với Ruby one-liner bằng cách thêm nó làm đối số cho -etùy chọn (thông báo cho trình thông dịch diễn giải đối số -ethay vì tìm kiếm tập lệnh trong tệp).

Đối với vấn đề cụ thể này, bạn có thể sử dụng một lớp lót sau (được điều chỉnh từ /programming//a/3184271/789593 ):

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

Nói một cách dễ hiểu

  • khớp với bất kỳ 3 ký tự hoặc ít nhất một ký tự, scan(/.{3}|.+/)trong chuỗi đầu vào, $_(trong trường hợp này, đầu vào dự kiến ​​sẽ đến từ tiêu chuẩn trong) và đặt mỗi trận đấu trong một mảng,
  • nối mảng thành một chuỗi có dấu '+' kết nối từng phần tử join("+"),
  • và in nó bị chấm dứt bởi một dòng mới puts.

Ví dụ

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

Lưu ý rằng nó không thêm bất kỳ dấu '+' nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.