我必须使用以下命名模式合并文件:
[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/
答案 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