Mở rộng tham số trong biến được gán với ký tự đại diện


8

Tôi có hai tệp trong thư mục hiện tại của mình (MA502) có tên là -

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq
MA502_TAAGGCGA-TCGCAGG_L001_R2_001.at.fastq

Tôi có nhiều thư mục như vậy - ví dụ MA503, MA504, v.v. và tôi muốn lặp lại những thư mục đó.

Tôi chỉ định tên biến của mình bằng cách sử dụng thẻ hoang dã -

Forward=*R1*.at.fastq
Reverse=*R2*.at.fastq

Tôi muốn xử lý các tập tin trong một kịch bản, và tôi muốn đầu ra của tôi để thay thế .atcho .atqt, do đó tên cuối cùng sẽ trông giống như -

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq
MA502_TAAGGCGA-TCGCAGG_L001_R2_001.atqt.fastq

Tôi đã thử

awk 'script' $Forward > ${Forward/.at/.atqt}

Tên tập tin cuối cùng của tôi trông giống như -

*R1*.atqt.fastq

thay vì sự mong đợi của tôi

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

Tôi đã học mọi thứ bằng sự cần thiết trên unix, vì vậy tôi không chắc cách xử lý tên biến. Bất kỳ trợ giúp được đánh giá cao!

Câu trả lời:


13

Lệnh Forward=*R1*.at.fastqđặt biến Forwardthành chuỗi *R1*.at.fastq(sao, viết hoa R, chữ số 1, dấu sao, dấu chấm, chữ thường A, v.v.). Ký tự đại diện chỉ được mở rộng trong ngữ cảnh cho phép nhiều từ; kích thước bên phải của một phép gán biến sẽ mong đợi một từ duy nhất, do đó không xảy ra sự mở rộng ký tự đại diện.

Trong một lệnh như cat $Forward, các ký tự đại diện trong giá trị Forwardđược mở rộng. Khi một biến được mở rộng bên ngoài dấu ngoặc kép, giá trị của nó được đặt trong danh sách các mẫu ký tự đại diện được phân tách bằng khoảng trắng và nếu bất kỳ mẫu nào khớp với một hoặc nhiều tệp, nó sẽ được thay thế bằng danh sách các tệp.

Trong ${Forward/.at/.atqt}, trước hết giá trị của biến được ngẩng đầu lên: *R1*.at.fastq. Sau đó, sự thay thế văn bản được áp dụng cho chuỗi này, mang lại *R1*.atqt.fastq. Kết quả là một sự mở rộng biến không được trích dẫn để nó được hiểu là một mẫu ký tự đại diện. Nhưng *R1*.atqt.fastqkhông khớp với bất kỳ tập tin nào, vì vậy nó không thay đổi.

Để mở rộng ký tự đại diện khi cài đặt Forward, bạn có thể biến nó thành một mảng.

Forward=(*R1*.at.fastq)

Điều này đặt Forwardthành một mảng 1 phần tử, phần tử là chuỗi MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq. Mẫu ký tự đại diện được mở rộng vào danh sách các kết quả khớp vì nó nằm trong ngữ cảnh (dấu ngoặc đơn của phép gán mảng) nơi có nhiều từ được mong đợi.

Trong bash, $Forwardkhi Forwardmột mảng tương đương với ${Forward[0]}- tham chiếu một biến mảng có cùng cú pháp như một biến vô hướng đề cập đến phần tử đầu tiên của mảng. Vì vậy, bạn có thể để lệnh awk của bạn không thay đổi.


Kịch bản đã làm việc, và lời giải thích của bạn đến với tôi rất dễ dàng. Cảm ơn rất nhiều!
Ayush Saxena
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.