如何 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.gz
和 K1-01_sortmerna_trimmomatic_2.fq.gz
.
下次遍历目录时,$FWD
和 $REV
分别为 K1-02_sortmerna_trimmomatic_1.fq.gz
和 K1-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
- 有关我将
FWD
和 REV
替换为 fwd
和 rev
的原因的解释,请参见 Correct Bash and shell script variable capitalization。
我目前正在处理 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.gz
和 K1-01_sortmerna_trimmomatic_2.fq.gz
.
下次遍历目录时,$FWD
和 $REV
分别为 K1-02_sortmerna_trimmomatic_1.fq.gz
和 K1-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
- 有关我将
FWD
和REV
替换为fwd
和rev
的原因的解释,请参见 Correct Bash and shell script variable capitalization。