我觉得这是个蹩脚的问题,但经过多次尝试,我被困住了。我有很多这样的文件:
S2EC1_DKDL220005480-2a-AK13554-7UDI265_HHJ2MCCX2_L8_1.fq.gz
S2EC1_DKDL220005480-2a-AK13554-7UDI265_HHJ2MCCX2_L8_2.fq.gz
S2EC2_DKDL220005480-2a-5UDI249-7UDI265_HHJ2MCCX2_L8_1.fq.gz
S2EC2_DKDL220005480-2a-5UDI249-7UDI265_HHJ2MCCX2_L8_2.fq.gz
S2EC11_DKDL220005480-2a-5UDI251-5UDI1063_HHJ2MCCX2_L8_1.fq.gz
S2EC11_DKDL220005480-2a-5UDI251-5UDI1063_HHJ2MCCX2_L8_2.fq.gz我试着把它们重命名如下:
S2EC1_R1.fastq.gz
S2EC1_R2.fastq.gz
S2EC2_R1.fastq.gz
S2EC2_R2.fastq.gz
S2EC11_R1.fastq.gz
S2EC11_R2.fastq.gz文件名是可变长度。在每个文件名、DKDL220005480-2a-和_HHJ2MCCX2_L8中都有相同的位,但中间的位是中间的一点,在组合和长度上是可变的。
从bash shell中,我可以以一种分步的方式取得一些进展,通过这样做可以消除常量文本:
for x in *; do mv $x ${x/DKDL220005480-2a-/}; done
for x in *; do mv $x ${x/_HHJ2MCCX2_L8_/_R}; done它产生的文件名如下:
S2EC1_AK13554-7UDI265_R1.fq.gz
S2EC1_AK13554-7UDI265_R2.fq.gz
S2EC2_5UDI249-7UDI265_R1.fq.gz
S2EC2_5UDI249-7UDI265_R2.fq.gz
S2EC11_5UDI251-5UDI1063_R1.fq.gz
S2EC11_5UDI251-5UDI1063_R2.fq.gz但现在我没能找到并替换中间的可变部分。当然,一蹴而就也要优雅得多。
下面是我认为最有希望匹配可变中间位的代码:
for x in *; do mv $x ${x/_(.+)_/}; done但我知道这个错误:
mv: 'S2EC1_AK13554-7UDI265_R1.fq.gz' and 'S2EC1_AK13554-7UDI265_R1.fq.gz' are the same file
mv: 'S2EC1_AK13554-7UDI265_R2.fq.gz' and 'S2EC1_AK13554-7UDI265_R2.fq.gz' are the same file
mv: 'S2EC2_5UDI249-7UDI265_R1.fq.gz' and 'S2EC2_5UDI249-7UDI265_R1.fq.gz' are the same file
mv: 'S2EC2_5UDI249-7UDI265_R2.fq.gz' and 'S2EC2_5UDI249-7UDI265_R2.fq.gz' are the same file
mv: 'S2EC11_5UDI251-5UDI1063_R1.fq.gz' and 'S2EC11_5UDI251-5UDI1063_R1.fq.gz' are the same file
mv: 'S2EC11_5UDI251-5UDI1063_R2.fq.gz' and 'S2EC11_5UDI251-5UDI1063_R2.fq.gz' are the same file不确定我的正则表达式或mv代码是否有问题(或者两者都有,甚至可能有其他问题,哈哈)。
谢谢
发布于 2022-08-12 13:38:37
模式匹配和正则表达式是两件不同的事情。在模式匹配中,*表示任何字符串。在正则表达式中,它指的是前面的零或多个。在模式匹配中,(.+)意味着..。文字(.+)字符串。在正则表达式中,它表示至少一个字符的捕获组。
对于简单的重命名方案,您可以尝试:
for f in *.fq.gz; do
g="${f/_DKDL220005480-2a-*_HHJ2MCCX2_L8_/_R}"
printf 'mv "%s" "%s"\n' "$f" "${g%.fq.gz}.fastq.gz"
# mv "$f" "${g%.fq.gz}.fastq.gz"
done对输出满意后,取消对mv行的注释。
发布于 2022-08-12 19:13:03
要在bash中使用正则表达式,需要使用[[ $x =~ regex ]],可以在$BASH_REMATCH中使用组,因此:
for x in *; do
[[ $x =~ ^(S2EC[0-9]+)_.*_([0-9]+).fq.gz$ ]] &&
mv $x ${BASH_REMATCH[1]}_R${BASH_REMATCH[2]}.fastq.gz
donehttps://stackoverflow.com/questions/73334877
复制相似问题