有了这些,文件批量重命名还需要求助其它工具吗?

经验整理

NGS系列文章包括NGS基础、转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这)、ChIP-seq分析 ChIP-seq基本分析流程、单细胞测序分析 (重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述))、DNA甲基化分析、重测序分析、GEO数据挖掘典型医学设计实验GEO数据分析 (step-by-step) – Limma差异分析、火山图、功能富集等内容。

简单重命名

Linux下文件重命名可以通过两个命令完成(收藏| 15 个你非了解不可的 Linux 特殊字符,妈妈再也不用担心我看不懂这些符 了!)mvrename

  • mv: 直接运行可以进行单个文件的重命名,如 mv old_name.txt new_name.txt
  • rename: 默认支持单个文件或有固定规律的一组文件的批量重命名,示例如下。
  • rename演示

    使用touch新建文件(Linux – 文件操作),两个样品(分别是易生信a,易生信b),各自双端测序得到的FASTQ文件(Linux – 文件排序和FASTA文件操作)

    ysx@ehbio:~/test$ touch YSX_a_1.fq.gz YSX_a_2.fq.gz YSX_b_2.fq.gz YSX_b_1.fq.gzysx@ehbio:~/test$ lsYSX_a_1.fq.gz  YSX_a_2.fq.gz  YSX_b_1.fq.gz  YSX_b_2.fq.gz

    把文件名中的易生信(YSX)改为易汉博 (ehbio):

    # rename '被替换文字' '要替换成的文字' 操作对象ysx@ehbio:~/test$ rename 'YSX' 'ehbio' *.gzysx@ehbio:~/test$ lsehbio_a_1.fq.gz  ehbio_a_2.fq.gz  ehbio_b_1.fq.gz  ehbio_b_2.fq.gz

    不同操作系统,rename的使用方法略有不同。印象中:

  • 在CentOS都是上面的语法 rename old new file_list
  • 在Ubuntu都是下面的语法 rename s/old/new/ file_list(Docker的基本使用-Ubuntu18.04)
  • # 在CentOS下,该命令未起作用ysx@ehbio:~/test$ rename 's/ehbio_//' *ysx@ehbio:~/test$ lsehbio_a_1.fq.gz  ehbio_a_2.fq.gz  ehbio_b_1.fq.gz  ehbio_b_2.fq.gz# 如果写的rename命令没发挥作用,使用man rename查看其具体使用方法, 个人经验,无外乎上面提到的两种用法。ysx@ehbio:~/test$ man rename# NAME#        rename - rename files## SYNOPSIS#        rename [options] expression replacement file...

    替换后缀:

    # 替换后缀ysx@ehbio:~/test$ rename 'fq' 'fastq' *.gzysx@ehbio:~/test$ lsehbio_a_1.fastq.gz  ehbio_a_2.fastq.gz  ehbio_b_1.fastq.gz  ehbio_b_2.fastq.gz

    复杂重命名

    但有时,需要重命名的文件不像上面那样有很清晰的模式,直接可以替换,需要多几步处理获得对应关系。

    假如已经有对应关系

    如下name.map.txt是自己手动编写的文件(Linux – 文件内容操作)a对应Control, b对应Treatment

    ysx@ehbio:~/test$ lsname.map.txt ehbio_a_1.fastq.gz  ehbio_a_2.fastq.gz  ehbio_b_1.fastq.gz  ehbio_b_2.fastq.gzysx@ehbio:~/test$ cat name.map.txta    Controlb    Treatment

    组合文件名,使用mv重命名

    首先组合出原名字和最终名字(Linux – 常用和不太常用的实用awk命令)

    ysx@ehbio:~/test$ awk '{print "ehbio_"$1"_1.fastq.gz", "ehbio_"$2"_1.fastq.gz", "ehbio_"$1"_2.fastq.gz",  "ehbio_"$2"_2.fastq.gz"}' name.map.txtehbio_a_1.fastq.gz ehbio_Control_1.fastq.gz ehbio_a_2.fastq.gz ehbio_Control_2.fastq.gzehbio_b_1.fastq.gz ehbio_Treatment_1.fastq.gz ehbio_b_2.fastq.gz ehbio_Treatment_2.fastq.gz

    加上mv

    ysx@ehbio:~/test$ awk '{print "mv ehbio_"$1"_1.fastq.gz ehbio_"$2"_1.fastq.gz"; print "mv ehbio_"$1"_2.fastq.gz ehbio_"$2"_2.fastq.gz";}' name.map.txtmv ehbio_a_1.fastq.gz ehbio_Control_1.fastq.gzmv ehbio_a_2.fastq.gz ehbio_Control_2.fastq.gzmv ehbio_b_1.fastq.gz ehbio_Treatment_1.fastq.gzmv ehbio_b_2.fastq.gz ehbio_Treatment_2.fastq.gz

    可以直接拷贝上面的输出再粘贴运行,或存储为文件运行:

    ysx@ehbio:~/test$ awk '{print "mv ehbio_"$1"_1.fastq.gz ehbio_"$2"_1.fastq.gz"; print "mv ehbio_"$1"_2.fastq.gz ehbio_"$2"_2.fastq.gz";}' name.map.txt >rename.shysx@ehbio:~/test$ #bash rename.sh

    也可以把print改为system直接运行:

    ysx@ehbio:~/test$ lsehbio_a_1.fastq.gz  ehbio_a_2.fastq.gz  ehbio_b_1.fastq.gz  ehbio_b_2.fastq.gz  name.map.txt  rename.shysx@ehbio:~/test$ awk '{system("mv ehbio_"$1"_1.fastq.gz ehbio_"$2"_1.fastq.gz"); system("mv ehbio_"$1"_2.fastq.gz ehbio_"$2"_2.fastq.gz");}' name.map.txtysx@ehbio:~/test$ lsehbio_Control_1.fastq.gz  ehbio_Control_2.fastq.gz  ehbio_Treatment_1.fastq.gz  ehbio_Treatment_2.fastq.gz  name.map.txt  rename.sh

    使用rename会不会稍微简单一点?

    一定注意符 匹配和避免误匹配(Linux – 常见错误和快捷操作)

    # 注意引 和空格ysx@ehbio:~/test$ awk '{print("rename "$1" "$2" *.fastq.gz"); }' name.map.txtrename a Control *.fastq.gzrename b Treatment *.fastq.gz# 上面的命令有什么问题吗?# fastq中也存在a,是否也会被替换# ehbio中也存在b,是否也会倍替换ysx@ehbio:~/test$ awk '{system("rename "$1" "$2" *.fastq.gz"); }' name.map.txt# 执行后,文件名都乱套了ysx@ehbio:~/test$ lsehbio_b_1.fControlstq.gz  ehbio_b_2.fControlstq.gz  ehTreatmentio_Control_1.fastq.gz  ehTreatmentio_Control_2.fastq.gz  name.map.txt  rename.sh# 再重命名回去,再次尝试ysx@ehbio:~/test$ rename 'Control' 'a' *ysx@ehbio:~/test$ rename 'Treatment' 'b' *ysx@ehbio:~/test$ lsehbio_a_1.fastq.gz  ehbio_a_2.fastq.gz  ehbio_b_1.fastq.gz  ehbio_b_2.fastq.gz  name.map.txt  rename.sh# 重命名两侧加下划线, 这也是我们做匹配时常需要注意的,尽量限制让匹配更准确ysx@ehbio:~/test$ awk '{system("rename _"$1"_ _"$2"_ *.fastq.gz"); }' name.map.txt# 打印出来看下ysx@ehbio:~/test$ awk '{print("rename _"$1"_ _"$2"_ *.fastq.gz"); }' name.map.txt# rename _a_ _Control_ *.fastq.gz# rename _b_ _Treatment_ *.fastq.gz# 这次没问题了ysx@ehbio:~/test$ lsehbio_Control_1.fastq.gz  ehbio_Control_2.fastq.gz  ehbio_Treatment_1.fastq.gz  ehbio_Treatment_2.fastq.gz  name.map.txt  rename.sh

    从原文件名获取对应关系

    基于paste

    像上面自己写好对应文件是一个方法,有时也可以从文件名推测规律,生成对应文件。

    如下有一堆测序原始数据(NGS基础 – 高通量测序原理),选择A组样品来查看:

    # 如下有一堆测序原始数据,选择A组样品来查看ysx@ehbio:~/test2# ls A*A1_FRAS192317015-1a_1.fq.gz  A2_FRAS192320421-1a_1.fq.gz  A3_FRAS192317017-1a_1.fq.gzA1_FRAS192317015-1a_2.fq.gz  A2_FRAS192320421-1a_2.fq.gz  A3_FRAS192317017-1a_2.fq.gz

    中间的那一串字符FRA…-是我们不需要的。

    观察规律,先按下划线将文件名分割(_),再获取第1,3个元素;另外习惯性给生物重复前面也加上下划线(用到了sed的记忆匹配)(Linux – SED操作,awk的姊妹篇)

    ysx@ehbio:~/test2# ls A*.gz | cut -f 1,3 -d '_' | sed 's/([A-E])/1_/'A_1_1.fq.gzA_1_2.fq.gzA_2_1.fq.gzA_2_2.fq.gz

    把原样品名字与新样品名字对应起来,这里用到了paste和输入重定向 (<)(Linux – 管道、标准输入输出):

    ysx@ehbio:~/test2# paste <(ls A*.gz) <(ls A*.gz | cut -f 1,3 -d '_' | sed 's/([A-E])/1_/')A1_FRAS192317015-1a_1.fq.gz    A_1_1_fq.gzA1_FRAS192317015-1a_2.fq.gz    A_1_2_fq.gzA2_FRAS192320421-1a_1.fq.gz    A_2_1_fq.gzA2_FRAS192320421-1a_2.fq.gz    A_2_2_fq.gzA3_FRAS192317017-1a_1.fq.gz    A_3_1_fq.gzA3_FRAS192317017-1a_2.fq.gz    A_3_2_fq.gz

    使用mv直接重命名 (还可以把这个脚本保存下来,保留原始名字和新名字的对应关系,万一操作错了,在看到结果异常时也可以方便回溯)(Bash概论 – Linux系列教程补充篇)

    ysx@ehbio:~/test2# paste <(ls A*.gz) <(ls A*.gz | cut -f 1,3 -d '_' | sed 's/([A-E])/1_/') | sed 's#^#/bin/mv #'/bin/mv A1_FRAS192317015-1a_1.fq.gz    A_1_1_fq.gz/bin/mv A1_FRAS192317015-1a_2.fq.gz    A_1_2_fq.gz/bin/mv A2_FRAS192320421-1a_1.fq.gz    A_2_1_fq.gz/bin/mv A2_FRAS192320421-1a_2.fq.gz    A_2_2_fq.gz/bin/mv A3_FRAS192317017-1a_1.fq.gz    A_3_1_fq.gz/bin/mv A3_FRAS192317017-1a_2.fq.gz    A_3_2_fq.gz

    软链接也是常用的 (但一定注意源文件使用全路径)(Linux – 原来你是这样的软连接)

    ysx@ehbio:~/test2# paste <(ls *.gz) <(ls *.gz | sed 's/./_/' | cut -f 1,3,4 -d '_' | sed 's/([A-E])/analysis/1_/') | sed 's#^#ln -s `pwd`/#'ln -s `pwd`/A1_FRAS192317015-1a_1.fq.gz    analysis/A_1_1_fq.gzln -s `pwd`/A1_FRAS192317015-1a_2.fq.gz    analysis/A_1_2_fq.gzln -s `pwd`/A2_FRAS192320421-1a_1.fq.gz    analysis/A_2_1_fq.gz...ln -s `pwd`/E15_FRAS192317028-1a_1.fq.gz    analysis/E_15_1_fq.gzln -s `pwd`/E15_FRAS192317028-1a_2.fq.gz    analysis/E_15_2_fq.gz

    基于awk

    转换下输入数据的格式,字符处理在awk也可以操作Linux – 常用和不太常用的实用awk命令,但我更习惯使用命令组合,每一步都用最简单的操作,不容易出错。

    ysx@ehbio:~/test2# ls A*.gz | sed -e 's/([A-E])/1_/'A_1_FRAS192317015-1a_1.fq.gzA_1_FRAS192317015-1a_2.fq.gzA_2_FRAS192320421-1a_1.fq.gzA_2_FRAS192320421-1a_2.fq.gzA_3_FRAS192317017-1a_1.fq.gzA_3_FRAS192317017-1a_2.fq.gzysx@ehbio:~/test2# ls A*.gz | sed -e 's/([A-E])/1_/' -e 's/./_./'A_1_FRAS192317015-1a_1_.fq.gzA_1_FRAS192317015-1a_2_.fq.gzA_2_FRAS192320421-1a_1_.fq.gzA_2_FRAS192320421-1a_2_.fq.gzA_3_FRAS192317017-1a_1_.fq.gzA_3_FRAS192317017-1a_2_.fq.gz

    采用awk生成对应关系:

    # 生成样品重复,计数出错了,每行记了一个数,而实际两行是一个样本。ysx@ehbio:~/test2# ls A*.gz | sed -e 's/([A-E])/1_/' -e 's/./_./' | awk 'BEGIN{OFS=" ";FS="_"}{sum[$1]+=1; print $0, $1"_"sum[$1]"_"$4$5;}'A_1_FRAS192317015-1a_1_.fq.gz A_1_1.fq.gzA_1_FRAS192317015-1a_2_.fq.gz A_2_2.fq.gzA_2_FRAS192320421-1a_1_.fq.gz A_3_1.fq.gzA_2_FRAS192320421-1a_2_.fq.gz A_4_2.fq.gzA_3_FRAS192317017-1a_1_.fq.gz A_5_1.fq.gzA_3_FRAS192317017-1a_2_.fq.gz A_6_2.fq.gz
    # 稍微改进下ysx@ehbio:~/test2# ls A*.gz | sed -e 's/([A-E])/1_/' -e 's/./_./' | awk 'BEGIN{OFS=" ";FS="_"}{sum[$1]+=1; print $0, $1"_"sum[$1]"_"$4$5;}'A_1_FRAS192317015-1a_1.fq.gz A_1_1.fq.gzA_1_FRAS192317015-1a_2.fq.gz A_2_2.fq.gzA_2_FRAS192320421-1a_1.fq.gz A_3_1.fq.gzA_2_FRAS192320421-1a_2.fq.gz A_4_2.fq.gzA_3_FRAS192317017-1a_1.fq.gz A_5_1.fq.gzA_3_FRAS192317017-1a_2.fq.gz A_6_2.fq.gz# 记得源文件名字的替换ysx@ehbio:~/test2# ls A*.gz | sed -e 's/([A-E])/1_/' -e 's/./_./' | awk 'BEGIN{OFS=" ";FS="_"}{sum[$1]+=1; print $0, $1"_"sum[$1]"_"$4$5;}' | sed -e 's/_//' -e 's/_././' -e 's#^#ln -s `pwd`/#' |headln -s `pwd`/A1_FRAS192317015-1a_1.fq.gz A_1_1.fq.gzln -s `pwd`/A1_FRAS192317015-1a_2.fq.gz A_2_2.fq.gz

    好了,重命名就到这了。有了这个思路,关键是如何根据自己的文件名字特征,构造对应的匹配关系

    另外,Window下使用Git for windows应该也可以实现对应的操作(Windows轻松实现linux shell环境:gitforwindows)

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年7月1日
    下一篇 2022年7月1日

    相关推荐