Ekspansi parameter dalam variabel yang ditetapkan dengan wildcard

8

Saya memiliki dua file di folder saya saat ini (MA502) yang namanya -

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

Saya memiliki banyak folder seperti - ex MA503, MA504 dll, dan saya ingin mengulanginya.

Saya menetapkan nama variabel saya menggunakan kartu liar -

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

Saya ingin memproses file-file ini dalam naskah, dan saya ingin output saya untuk menggantikan .atuntuk .atqt, sehingga nama akhir akan terlihat seperti -

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

Saya mencoba

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

Nama file terakhir saya terlihat seperti -

*R1*.atqt.fastq

bukannya harapan saya yang dulu

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

Saya telah mempelajari semuanya dengan keharusan di unix, jadi saya tidak yakin bagaimana nama variabel diproses. Bantuan apa pun dihargai!

Ayush Saxena
sumber

Jawaban:

13

Perintah Forward=*R1*.at.fastqmengatur variabel Forwardke string *R1*.at.fastq(bintang, huruf kapital R, angka 1, bintang, titik, huruf kecil A, dll.). Wildcard hanya diperluas dalam konteks yang memungkinkan banyak kata; ukuran kanan dari penugasan variabel mengharapkan satu kata, jadi tidak ada ekspansi wildcard terjadi.

Dalam perintah seperti cat $Forward, wildcard dalam nilai Forwarddiperluas. Ketika suatu variabel diperluas di luar tanda kutip ganda, nilainya dimasukkan sebagai daftar pola wildcard yang dibatasi spasi, dan jika ada pola yang cocok dengan satu atau lebih file, itu diganti oleh daftar file.

Dalam ${Forward/.at/.atqt}, pertama nilai variabel adalah mendongak: *R1*.at.fastq. Kemudian substitusi teks diterapkan ke string ini, menghasilkan *R1*.atqt.fastq. Hasilnya adalah ekspansi variabel yang tidak dikutip sehingga ditafsirkan sebagai pola wildcard. Tetapi *R1*.atqt.fastqtidak cocok dengan file apa pun, jadi tidak berubah.

Untuk memperluas wildcard saat pengaturan Forward, Anda bisa membuatnya menjadi array.

Forward=(*R1*.at.fastq)

Ini set Forwardke array 1-elemen, elemen menjadi string MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq. Pola wildcard diperluas ke daftar kecocokan karena itu dalam konteks (tanda kurung array array) di mana beberapa kata diharapkan.

Dalam bash, $Forwardkapan Forwardarray setara dengan ${Forward[0]}- mereferensikan variabel array dengan sintaksis yang sama dengan variabel skalar mengacu pada elemen pertama array. Jadi Anda dapat membiarkan perintah awk Anda tidak berubah.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Scriptnya bekerja, dan penjelasan Anda sangat mudah bagi saya. Terima kasih banyak!
Ayush Saxena