如何 select 目录中的两个文件,并且总是每隔一个文件?

How to select two files from a directory, and always every other file?

我目前正在处理 RNA-Seq 数据,我有一个目录包含许多样本的正向和反向序列。我想要 运行 工具,例如 SortMeRNA,但为此我需要正向和反向序列的文件名,因为数据是成对结束的。

我的目录类似于这样:

data/expression/samples/K1-01_sortmerna_trimmomatic_1.fq.gz
data/expression/samples/K1-01_sortmerna_trimmomatic_2.fq.gz
data/expression/samples/K1-02_sortmerna_trimmomatic_1.fq.gz
data/expression/samples/K1-02_sortmerna_trimmomatic_2.fq.gz
data/expression/samples/K1-03_sortmerna_trimmomatic_1.fq.gz
data/expression/samples/K1-03_sortmerna_trimmomatic_2.fq.gz
data/expression/samples/K1-04_sortmerna_trimmomatic_1.fq.gz
data/expression/samples/K1-04_sortmerna_trimmomatic_2.fq.gz
...
data/expression/samples/K1-20_sortmerna_trimmomatic_1.fq.gz
data/expression/samples/K1-20_sortmerna_trimmomatic_2.fq.gz

我想做的是成对 select 文件并将它们分配给一个变量,然后我可以将其传递给 selected 软件,而不必为每个文件创建一个变量文件。

我希望代码能够通过给我 $FWD$REV 作为文件名 K1-01_sortmerna_trimmomatic_1.fq.gzK1-01_sortmerna_trimmomatic_2.fq.gz.

下次遍历目录时,$FWD$REV 分别为 K1-02_sortmerna_trimmomatic_1.fq.gzK1-02_sortmerna_trimmomatic_2.fq.gz

我已经编写了这段代码,这可能不是处理这个问题的非常有效的方法(并且不起作用)。

DATA_LOCATION=data/expression/samples/
cd $DATA_LOCATION
files=(*.fq.gz)
total=${#files[@]}
idx=0

FWD_DONE=false
REV_DONE=false

for file in "${files[@]:idx}"; do

    if [ !$FWD_DONE ]; then
        idx=$(( idx + 1 ))
        FWD=$(basename $file)[$idx]
        echo $FWD
        FWD_DONE=true
        REV_DONE=false
    fi

    if [ !$REV_DONE ] && [ $FWD_DONE ]; then
        idx=$(( idx + 1 ))
        REV=$(basename $file)[$idx]
        echo $REV
        REV_DONE=true
        FWD_DONE=false
    fi

    echo index $idx
done

不幸的是,这使得每次传递的 $FWD$REV 变量相同。我的猜测是它与 for 语句不随内部索引增量更新有关。不幸的是,我对 shell 脚本编写还很陌生,我还没有找到任何其他有帮助的来源。

如有任何帮助,我们将不胜感激!如果这意味着整个过程可以变得更简单,我非常愿意丢弃我自己的代码。

一旦 cd进入包含数据文件的目录,此代码是否满足您的要求?

for fwd in *_1.fq.gz; do
    rev=${fwd%_1.fq.gz}_2.fq.gz
    # CODE THAT USES "$fwd" AND "$rev" GOES HERE
done
  • 有关我将 FWDREV 替换为 fwdrev 的原因的解释,请参见 Correct Bash and shell script variable capitalization