重命名多个配对文件,删除中间不同的条形码字符串?

重命名多个配对文件,删除中间不同的条形码字符串?

我有一堆配对文件,文件中间带有不需要的条形码标签,例如:

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

相关内容