the*_*ile 1 command-line bash filenames bioinformatics
我正在尝试设置一个 for 循环来对成对的文件运行一个进程。文件名看起来像这样
36_002_CGATGT_L001_ R1 _005.fastq.gz 36_002_CGATGT_L001_ R2 _005.fastq.gz 36_002_CGATGT_L001_ R1 _002.fastq.gz 36_002_CGATGT_L001_ R2 _002.fastq.gz 62_013_AGTCAA_L001_ R1 _003.fastq.gz 62_013_AGTCAA_L001_ R2 _003.fastq.gz
我需要在以下命令中使用每一对
sickle pe -f 36_002_CGATGT_L001_R1_005.fastq.gz \
-r 36_002_CGATGT_L001_R2_005.fastq.gz\
-o trimmed_36_002_CGATGT_L001_R1_005.fastq.gz\
-p trimmed_36_002_CGATGT_L001_R2_005.fastq.gz\
-s 36_002_CGATGT_L001_singles_005.fastq.gz
Run Code Online (Sandbox Code Playgroud)
首先,我正在尝试:
for n in *R1*; do m='basename $n R2' ; echo $m; done
Run Code Online (Sandbox Code Playgroud)
但显然这种方法不起作用,因为文件名的正面和背面都很重要。我是否需要重命名文件,以便 R1 和 R2 是名称的最后一部分?这会很尴尬但并非不可能
如果您的 shell 支持 ksh${var/search/replace}
形式的参数扩展(ksh93
, zsh
, mksh
, yash
, bash
):
for r1 in *R1*; do
r2=${r1/R1/R2}
singles=${r1/R1/singles}
trimmed1=trimmed$r1
trimmed2=trimmed$r2
sickle pe -f "$r1" \
-r "$r2" \
-o "$trimmed1" \
-p "$trimmed2" \
-s "$singles"
done
Run Code Online (Sandbox Code Playgroud)
POSIXly,你可以做
r2=${r1%%R1*}R2${r1#*R1}
Run Code Online (Sandbox Code Playgroud)