Điểm:0

Làm cách nào để nối mẫu đầu tiên của biểu thức chính quy vào cuối dòng bằng cách sử dụng sed?

lá cờ ke

Tôi có tệp .fasta (văn bản) chứa dữ liệu trình tự DNA ở định dạng như sau:

>uce-8374_Genus_species
ACGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTACGATCGCGGTATATCGGCGATTCGATCG

>uce-239_Genus_species
ATCGTAGCATGCGCTAGCTAGCTAGCTCGCGGTACGCATGTCTGACTGCGTCTGGTCGTACGATTACTACGACTGCG

>uce-83_Genus_species
ATCGATCTAGCGTAGCATGCGATCGATATCTGCGATCGACTCGATGCATGCATGCATCGATGCTAGCTAGCTAGCTA

>uce-902_Genus_species
AGCTGACTAGCTGGCGATACTGGCGATATCGGATTACGCGGCATATCGAGCGAGTCGATCGATGCATCTGATGCAGC

Tôi đang cố nối thêm mọi thứ trước đầu tiên dấu gạch dưới, trước một | để chỉ cuối dòng có >. Vì vậy, ví dụ, trình tự đầu tiên sẽ đọc: uce-8374_Genus_species|uce-8374, theo sau là chuỗi DNA bên dưới nó. Có cách nào để làm điều này trong sed? Tôi đã thử lưu trữ ^[^_]+(?=_) vào một biến, nhưng nó không hoạt động và cứ nối thêm ^[^_]+(?=_) đến cuối dòng thay vì chính mẫu đó. Mọi trợ giúp, cũng như giải thích (vì tôi chưa quen với regex) sẽ hữu ích. Nếu có một cách tốt hơn để giải quyết vấn đề này, tôi sẵn sàng cho các lựa chọn khác!

Cho đến nay, tôi đã thử (tôi sẽ chỉ hiển thị chuỗi DNA đầu tiên, nhưng tôi muốn thay đổi tất cả chúng):

sed -E 's/species/species|^[^_]+(?=_)/' sample_file.fasta

Kết quả: uce-8374_Genus_species|^[^_]+(?=_)

và tôi cũng đã thử:

x="^[^_]+(?=_)"
sed -E "s/species/species|$x/" "sample_file.fasta"

Kết quả: uce-8374_Genus_species|^[^_]+(?=_)

Điểm:2
lá cờ hr

Không giống như Perl, sed không hỗ trợ cú pháp tra cứu PCRE (?=_) nhưng bạn có thể giả mạo nó như sau:

  • trận đấu > neo vào đầu dòng ^>
  • sau đó khớp và chụp không hoặc nhiều hơn_ nhân vật ([^_]*)
  • sau đó phù hợp với mọi thứ khác .*

sau đó thay thế bằng

  • toàn bộ mẫu phù hợp &
  • theo sau là nghĩa đen | và sau đó là nhóm bị bắt đầu tiên \1

Cho nên

$ sed -E 's/^>([^_]*).*/&|\1/' sample_file.fasta 
>uce-8374_Genus_species|uce-8374
ACGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTACGATCGCGGTATATCGGCGATTCGATCG

>uce-239_Genus_species|uce-239
ATCGTAGCATGCGCTAGCTAGCTAGCTCGCGGTACGCATGTCTGACTGCGTCTGGTCGTACGATTACTACGACTGCG

>uce-83_Genus_species|uce-83
ATCGATCTAGCGTAGCATGCGATCGATATCTGCGATCGACTCGATGCATGCATGCATCGATGCTAGCTAGCTAGCTA

>uce-902_Genus_species|uce-902
AGCTGACTAGCTGGCGATACTGGCGATATCGGATTACGCGGCATATCGAGCGAGTCGATCGATGCATCTGATGCAGC
Justin avatar
lá cờ ke
Điều đó đã làm việc! Cảm ơn bạn! Nếu bạn không phiền, bạn có thể giải thích điều này đang làm gì không? cụ thể là phần thứ hai và thứ ba của cú pháp `sed` ở đây?
lá cờ hr
@Justin vui lòng xem câu trả lời cập nhật

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.