如何从多个文件名中删除一串字母、数字和非字母数字字符,其中每个文件的值不同:
文件示例:
11SP60_H5LMLDSX7_AAGATACACG-TGTTAGCACA_L004_R1.fastq.gz
12HH32_H5LMLDSX7_TGCAATGAAT-TTACTTCTGG_L001_R2.fastq.gz
B00699_H5LMLDSX7_CCGCTCCGTT-CTTCGCCGTA_L002_R1.fastq.gz
A80101_H5LMLDSX7_TAGGTATGTT-CTTGGTCTCG_L003_R1.fastq.gz
我想要的输出示例:
11SP60_L004_R1.fastq.gz
12HH32_L001_R2.fastq.gz
B00699_L002_R1.fastq.gz
A80101_L003_R1.fastq.gz
由于使用权限,我无法使用删除功能。 谢谢!
您需要遍历文件名。在 bash 中是:
for f in *.fastq.gz ; do
newf=$(echo $f| sed 's/\([^_]*\)_[^_]*_[^_]*_\(.*\)/\1_\2/')
echo "mv $f $newf"
done
查看输出。如果您对
bash
不是很有经验,最好先尝试 echo
。否则,如果你犯了一个错误,你可能会得到不想要的结果。
当您对新名称正确感到满意时,更换
echo "mv $f $newf
与
mv "$f" "$newf"
与纯
bash
:
for file in *_*_*_*_*.fastq.gz; do
head=${file%%_*}
tail=${file#*_*_*_}
echo mv "$file" "${head}_${tail}" # Drop the echo if the output looks good
done
这也应该适用于 POSIX shell。您不必调用外部实用程序(如
sed
或 awk
)。 bash
和 POSIX shell 内置支持执行这种字符串操作。