使用shell脚本通过标识符合并fastq文件

时间:2016-04-19 09:15:39

标签: bash shell

我必须使用以下命名模式合并文件:

[SampleID]_[custom_ID01]_ID[RUN_ID]_L001_R1.fastq
[SampleID]_[custom_ID02]_ID[RUN_ID]_L002_R1.fastq
[SampleID]_[custom_ID03]_ID[RUN_ID]_L003_R1.fastq
[SampleID]_[custom_ID04]_ID[RUN_ID]_L004_R1.fastq

我需要合并所有具有相同[SampleID]但不同“Lanes”(L001-L004)的文件。 直接在终端中运行时,以下脚本可以正常工作:

custom_id="000"
RUN_ID="0025"
wd="/path/to/script/"  # was missing/ incorrect

 # get ALL sample identifiers
touch temp1.txt
for line in $wd/*.fastq ; do
    fastq_identifier=$(echo "$line" | cut -d"_" -f1);
    echo $fastq_identifier >> temp1.txt
done

# get all uniqe samples identical
cat temp1.txt | uniq > temp2.txt
input_var=$(cat temp2.txt)

# concatenate all fastq (different lanes)  with identical identifier
for line in $input_var; do
        cat $line*fastq >> $line"_"$custom_id"_ID"$Run_ID"_L001_R1.fastq"
done
rm temp1.txt temp2.txt;

但是如果我创建一个脚本文件(concatenate_fastq.sh)并使其可执行

 $ chomd +x concatenate_fastq.sh

并运行它

$ ./concatenate_fastq.sh

我收到以下错误:

$ concatenate_fastq.sh: line 17: /*.fastq_000_ID_L001_R1.fastq: Keine Berechtigung # = Permission denied

根据您的提示,我通过修复解决了问题

wd=/path/to/script/

2 个答案:

答案 0 :(得分:1)

直接问题似乎是wd未设置。如果你的脚本确实真正包含了

wd="/path/to/script/"

然后我会怀疑脚本文件中的隐形控制字符(使用Windows编辑器是一种常见的方式来拍摄自己的脚)。

更一般地说,当通配符与任何文件都不匹配时,您的脚本应该正确处理。一种常见的方法是shopt -s nullglob,但随后的脚本仍然需要适应。

重构脚本以仅循环实际匹配将有助于避免麻烦。也许是这样的:

shopt -s nullglob  # bashism
printf '%s\n' "$wd"/*.fastq |
cut -d_ -f1 |
uniq |
while read -r line; do
    cat "$line"*fastq >> "${line}_${custom_id}_ID${Run_ID}_L001_R1.fastq"
done

你会发现这极大地简化了脚本,避免了讨厌的临时文件。

答案 1 :(得分:1)

我解决了它:

if [ $# -ne 3 ] ; then
  echo -e "Usage: $0 {path_to_working_directory} {custom_ID:Z+} {run_ID:ZZZZ}\n"
  exit 1
fi

cwd=$(pwd)
wd=$1
custom_id=$2
RUN_ID=$3
folder=$(basename $wd)

input_var=$(ls *fastq | cut --fields 1 -d "_" | uniq)

for line in $input_var; do
    cat $line*fastq >> $line"_"$custom_id"_ID"$RUN_ID"_L001_R1.fastq"
done