我有一堆配对文件,文件中间带有不需要的条形码标签,例如:
LIB008983_TRA00020080_TAAGGCGA-TATCCTCT_L001_R1.fastq.gz
LIB008983_TRA00020080_TAAGGCGA-TATCCTCT_L001_R2.fastq.gz
LIB008983_TRA00020081_TAAGGCGA-AGAGTAGA_L001_R1.fastq.gz
LIB008983_TRA00020081_TAAGGCGA-AGAGTAGA_L001_R2.fastq.gz
LIB008983_TRA00020082_TAAGGCGA-GTAAGGAG_L001_R1.fastq.gz
LIB008983_TRA00020082_TAAGGCGA-GTAAGGAG_L001_R2.fastq.gz
LIB008983_TRA00020083_TAAGGCGA-ACTGCATA_L001_R1.fastq.gz
LIB008983_TRA00020083_TAAGGCGA-ACTGCATA_L001_R2.fastq.gz
我需要删除条形码(在整个文件中各不相同),而不修改文件开头或结尾的标识符。
我尝试根据网上阅读的内容自己编写一个脚本,但这似乎是一个相对较差的尝试:
for f in LIB008983_TRA000{19916..20167}_*_L001_R*.fastq.gz;
do
newName=${f/_*_\ _L001_R*.fastq.gz}
mv -i "$f" "$newName";
done
这是我收到的错误消息:
mv: cannot stat ‘LIB008983_TRA00019917_*_L001_R*.fastq.gz’: No such file or directory
理想情况下,我的最终文件名是:
LIB008983_TRA00020136_L001_R1.fastq.gz
LIB008983_TRA00020136_L001_R2.fastq.gz
LIB008983_TRA00020137_L001_R1.fastq.gz
LIB008983_TRA00020137_L001_R2.fastq.gz
..
..
等等
答案1
因此,您在这里看到的问题是for
循环正在以您意想不到的方式扩展。范围{...}
运算符给出了所有可能的文件名的完整列表,而不仅仅是存在的文件名。
例如,文件 19917 不存在,导致出现该mv
错误消息。
您可以通过echo
在循环中放置一个来看到这一点:
for f in LIB008983_TRA000{19916..20167}_*_L001_R*.fastq.gz
do
echo "$f"
done
这给出了如下输出:
LIB008983_TRA00019916_*_L001_R*.fastq.gz
LIB008983_TRA00019917_*_L001_R*.fastq.gz
LIB008983_TRA00019918_*_L001_R*.fastq.gz
...
LIB008983_TRA00020078_*_L001_R*.fastq.gz
LIB008983_TRA00020079_*_L001_R*.fastq.gz
LIB008983_TRA00020080_TAAGGCGA-TATCCTCT_L001_R1.fastq.gz
LIB008983_TRA00020080_TAAGGCGA-TATCCTCT_L001_R2.fastq.gz
...
LIB008983_TRA00020084_*_L001_R*.fastq.gz
LIB008983_TRA00020085_*_L001_R*.fastq.gz
LIB008983_TRA00020086_*_L001_R*.fastq.gz
其中所有带有 的行都*
代表不存在的文件。
有两种方法可以解决这个问题。首先,如果您想保持范围,请围绕 进行测试mv
:
if [ -f "$f" ]
then
mv -i "$f" "$newName"
fi
现在,mv
仅当文件存在时才运行该命令。
第二种方法是,如果您不关心范围,只需让 glob 模式匹配:
for f in LIB008983_TRA000*_*_L001_R*.fastq.gz
do
newName=${f/_*_\ _L001_R*.fastq.gz}
mv -i "$f" "$newName"
done
在这两种情况下,您将不再尝试mv
不存在的文件。
作为旁注;你不需要其中的一些,;
所以我从我的答案中删除了它们。
您有第二个问题,您的“$newName”不是您想要的。我是一名老派ksh
编码员,可能有更好的bash
表达方式,但我会做类似的事情
tail=L${f##*_L}
head=${f%_*_$tail}_
newName="$head$tail"
mv -i "$f" "$newName"
现在给出您的输入文件列表,我们有
LIB008983_TRA00020080_L001_R1.fastq.gz
LIB008983_TRA00020080_L001_R2.fastq.gz
LIB008983_TRA00020081_L001_R1.fastq.gz
LIB008983_TRA00020081_L001_R2.fastq.gz
LIB008983_TRA00020082_L001_R1.fastq.gz
LIB008983_TRA00020082_L001_R2.fastq.gz
LIB008983_TRA00020083_L001_R1.fastq.gz
LIB008983_TRA00020083_L001_R2.fastq.gz