如何调用 BASH 中的程序执行的大量配对文件?

How to call a large list of paired files to be executed by a program in BASH?

我有一个很大的文件目录 (100+),我想通过终端通过一个程序。

这些文件是成对的,并且都遵循这样的命名方案:

 TS-8_S53_L001_R1_001.fastq 
 TS-8_S53_L001_R2_001.fastq
 RS-9_S54_L001_R1_001.fastq 
 RS-9_S54_L001_R2_001.fastq

程序执行如下:

Seqprogram -i1 Blah_R1_001.fastq -i2 Blah_R2_001.fastq -o Blah_paired.fastq

所有这些文件都在一个目录中。

我希望能够 运行 所有文件的程序,使用以正确顺序配对在一起的文件(R1 文件通过 i1 传递,R1 和 R2 文件具有相同的基本名称)和输出文件(-o)保存在基本名称下并附有一些标识符(“_paired”等)。

我已经设想过我将如何做到这一点 Python;但是,我正在努力通过 BASH.

变得更好

我很熟悉如何将多个文件调用到一个命令中;即解压缩特定目录中的所有 .gz 文件

gunzip "*.gz"

但是这个命令有两个输入,并且输入必须排序,所以通配符方案是不够的。

谢谢

最简单的方法是匹配三个模式化文件名中的一个,然后修改它以获得另外两个。

也就是说:

for r1file in *_R1_*.fastq; do
  r2file=${r1file/_R1_/_R2_}
  pairfile=${r1file%_R1_*}_paired.fastq
  Seqprogram -i1 "$r1file" -i2 "$r2file" -o "$pairfile"
done

使用通配符获取一对文件中的一个,然后使用参数替换获取其他对应的文件名。

for i1 in *_R1_001.fastq; do
    i2=${i1/R1_001/R2_001}
    paired=${i1/R1_001/paired}
    Seqprogram -i1 "$i1" -i2 "$i2" -o "$paired"
done