有了这些,文件批量重命名还需要求助其它工具吗?
經驗整理
NGS系列文章包括NGS基礎、轉錄組分析?(Nature重磅綜述|關于RNA-seq你想知道的全在這)、ChIP-seq分析?(ChIP-seq基本分析流程)、單細胞測序分析?(重磅綜述:三萬字長文讀懂單細胞RNA測序分析的最佳實踐教程 (原理、代碼和評述))、DNA甲基化分析、重測序分析、GEO數據挖掘(典型醫學設計實驗GEO數據分析 (step-by-step) - Limma差異分析、火山圖、功能富集)等內容。
簡單重命名
Linux下文件重命名可以通過兩個命令完成(收藏| 15 個你非了解不可的 Linux 特殊字符,媽媽再也不用擔心我看不懂這些符號了!),mv和rename。
-
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.gz ysx@ehbio:~/test$ ls YSX_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' *.gz ysx@ehbio:~/test$ ls ehbio_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)
替換后綴:
# 替換后綴 ysx@ehbio:~/test$ rename 'fq' 'fastq' *.gz ysx@ehbio:~/test$ ls ehbio_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$ ls name.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.txt a Control b 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.txt ehbio_a_1.fastq.gz ehbio_Control_1.fastq.gz ehbio_a_2.fastq.gz ehbio_Control_2.fastq.gz ehbio_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.txt mv ehbio_a_1.fastq.gz ehbio_Control_1.fastq.gz mv ehbio_a_2.fastq.gz ehbio_Control_2.fastq.gz mv ehbio_b_1.fastq.gz ehbio_Treatment_1.fastq.gz mv 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.sh ysx@ehbio:~/test$ #bash rename.sh也可以把print改為system直接運行:
ysx@ehbio:~/test$ ls ehbio_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("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.txt ysx@ehbio:~/test$ ls ehbio_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.txt rename a Control *.fastq.gz rename b Treatment *.fastq.gz# 上面的命令有什么問題嗎? # fastq中也存在a,是否也會被替換 # ehbio中也存在b,是否也會倍替換ysx@ehbio:~/test$ awk '{system("rename "$1" "$2" *.fastq.gz"); }' name.map.txt# 執行后,文件名都亂套了 ysx@ehbio:~/test$ ls ehbio_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$ ls ehbio_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$ ls ehbio_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.gz A1_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.gz A_1_2.fq.gz A_2_1.fq.gz A_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.gz A1_FRAS192317015-1a_2.fq.gz A_1_2_fq.gz A2_FRAS192320421-1a_1.fq.gz A_2_1_fq.gz A2_FRAS192320421-1a_2.fq.gz A_2_2_fq.gz A3_FRAS192317017-1a_1.fq.gz A_3_1_fq.gz A3_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.gz ln -s `pwd`/A1_FRAS192317015-1a_2.fq.gz analysis/A_1_2_fq.gz ln -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.gz ln -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.gz A_1_FRAS192317015-1a_2.fq.gz A_2_FRAS192320421-1a_1.fq.gz A_2_FRAS192320421-1a_2.fq.gz A_3_FRAS192317017-1a_1.fq.gz A_3_FRAS192317017-1a_2.fq.gz ysx@ehbio:~/test2# ls A*.gz | sed -e 's/\([A-E]\)/\1_/' -e 's/\./_./' A_1_FRAS192317015-1a_1_.fq.gz A_1_FRAS192317015-1a_2_.fq.gz A_2_FRAS192320421-1a_1_.fq.gz A_2_FRAS192320421-1a_2_.fq.gz A_3_FRAS192317017-1a_1_.fq.gz A_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.gz A_1_FRAS192317015-1a_2_.fq.gz A_2_2.fq.gz A_2_FRAS192320421-1a_1_.fq.gz A_3_1.fq.gz A_2_FRAS192320421-1a_2_.fq.gz A_4_2.fq.gz A_3_FRAS192317017-1a_1_.fq.gz A_5_1.fq.gz A_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.gz A_1_FRAS192317015-1a_2.fq.gz A_2_2.fq.gz A_2_FRAS192320421-1a_1.fq.gz A_3_1.fq.gz A_2_FRAS192320421-1a_2.fq.gz A_4_2.fq.gz A_3_FRAS192317017-1a_1.fq.gz A_5_1.fq.gz A_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`/#' |head ln -s `pwd`/A1_FRAS192317015-1a_1.fq.gz A_1_1.fq.gz ln -s `pwd`/A1_FRAS192317015-1a_2.fq.gz A_2_2.fq.gz好了,重命名就到這了。有了這個思路,關鍵是如何根據自己的文件名字特征,構造對應的匹配關系。
另外,Window下使用Git for windows應該也可以實現對應的操作(Windows輕松實現linux shell環境:gitforwindows)。
總結
以上是生活随笔為你收集整理的有了这些,文件批量重命名还需要求助其它工具吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈佛大学单细胞课程|笔记汇总 (八)
- 下一篇: GEO2R/GEOquery的结果可能是