有了這些禽车,文件批量重命名還需要求助其它工具嗎?

經(jīng)驗(yàn)整理

NGS系列文章包括NGS基礎(chǔ)刊殉、轉(zhuǎn)錄組分析 (Nature重磅綜述|關(guān)于RNA-seq你想知道的全在這)殉摔、ChIP-seq分析 (ChIP-seq基本分析流程)、單細(xì)胞測序分析 (重磅綜述:三萬字長文讀懂單細(xì)胞RNA測序分析的最佳實(shí)踐教程 (原理记焊、代碼和評述))逸月、DNA甲基化分析、重測序分析遍膜、GEO數(shù)據(jù)挖掘(典型醫(yī)學(xué)設(shè)計(jì)實(shí)驗(yàn)GEO數(shù)據(jù)分析 (step-by-step) - Limma差異分析彻采、火山圖、功能富集)等內(nèi)容捌归。

簡單重命名

Linux下文件重命名可以通過兩個(gè)命令完成(收藏| 15 個(gè)你非了解不可的 Linux 特殊字符肛响,媽媽再也不用擔(dān)心我看不懂這些符號(hào)了!)惜索,mvrename特笋。

  • mv: 直接運(yùn)行可以進(jìn)行單個(gè)文件的重命名,如 mv old_name.txt new_name.txt

  • rename: 默認(rèn)支持單個(gè)文件或有固定規(guī)律的一組文件的批量重命名,示例如下猎物。

rename演示

使用touch新建文件(Linux - 文件操作)虎囚,兩個(gè)樣品(分別是易生信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

不同操作系統(tǒng),rename的使用方法略有不同堤如。印象中:

# 在CentOS下蒲列,該命令未起作用
ysx@ehbio:~/test$ rename 's/ehbio_//' *
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命令沒發(fā)揮作用,使用man rename查看其具體使用方法, 個(gè)人經(jīng)驗(yàn)搀罢,無外乎上面提到的兩種用法蝗岖。
ysx@ehbio:~/test$ man rename

# NAME
#        rename - rename files
#
# SYNOPSIS
#        rename [options] expression replacement file...

替換后綴:

# 替換后綴
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

復(fù)雜重命名

但有時(shí),需要重命名的文件不像上面那樣有很清晰的模式榔至,直接可以替換抵赢,需要多幾步處理獲得對應(yīng)關(guān)系。

假如已經(jīng)有對應(yīng)關(guān)系

如下name.map.txt是自己手動(dòng)編寫的文件(Linux - 文件內(nèi)容操作)唧取,a對應(yīng)Control, b對應(yīng)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.gz

ysx@ehbio:~/test$ cat name.map.txt
a    Control
b    Treatment

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

首先組合出原名字和最終名字(Linux - 常用和不太常用的實(shí)用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

可以直接拷貝上面的輸出再粘貼運(yùn)行枫弟,或存儲(chǔ)為文件運(yùn)行:

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直接運(yùn)行:

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會(huì)不會(huì)稍微簡單一點(diǎn)彩匕?

一定注意符號(hào)匹配和避免誤匹配(Linux - 常見錯(cuò)誤和快捷操作)。

# 注意引號(hào)和空格
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驼仪,是否也會(huì)被替換
# ehbio中也存在b,是否也會(huì)倍替換

ysx@ehbio:~/test$ awk '{system("rename "$1" "$2" *.fastq.gz"); }' name.map.txt

# 執(zhí)行后袜漩,文件名都亂套了
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

# 重命名兩側(cè)加下劃線, 這也是我們做匹配時(shí)常需要注意的,盡量限制讓匹配更準(zhǔn)確
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

從原文件名獲取對應(yīng)關(guān)系

基于paste

像上面自己寫好對應(yīng)文件是一個(gè)方法宙攻,有時(shí)也可以從文件名推測規(guī)律奠货,生成對應(yīng)文件。

如下有一堆測序原始數(shù)據(jù)(NGS基礎(chǔ) - 高通量測序原理)座掘,選擇A組樣品來查看:

# 如下有一堆測序原始數(shù)據(jù)递惋,選擇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...-是我們不需要的。

觀察規(guī)律溢陪,先按下劃線將文件名分割(_)萍虽,再獲取第1,3個(gè)元素;另外習(xí)慣性給生物重復(fù)前面也加上下劃線(用到了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

把原樣品名字與新樣品名字對應(yīng)起來,這里用到了paste和輸入重定向 (<)(Linux - 管道、標(biāo)準(zhǔn)輸入輸出):

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直接重命名 (還可以把這個(gè)腳本保存下來邓馒,保留原始名字和新名字的對應(yīng)關(guān)系嘶朱,萬一操作錯(cuò)了,在看到結(jié)果異常時(shí)也可以方便回溯)(Bash概論 - Linux系列教程補(bǔ)充篇):

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

轉(zhuǎn)換下輸入數(shù)據(jù)的格式光酣,字符處理在awk也可以操作(Linux - 常用和不太常用的實(shí)用awk命令)疏遏,但我更習(xí)慣使用命令組合,每一步都用最簡單的操作救军,不容易出錯(cuò)财异。

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生成對應(yīng)關(guān)系:

# 生成樣品重復(fù),計(jì)數(shù)出錯(cuò)了缤言,每行記了一個(gè)數(shù)宝当,而實(shí)際兩行是一個(gè)樣本视事。# 生成樣品重復(fù)胆萧,計(jì)數(shù)出錯(cuò)了,每行記了一個(gè)數(shù)俐东,而實(shí)際兩行是一個(gè)樣本跌穗。
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
# 稍微改進(jìn)下
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

好了,重命名就到這了虏辫。有了這個(gè)思路蚌吸,關(guān)鍵是如何根據(jù)自己的文件名字特征,構(gòu)造對應(yīng)的匹配關(guān)系砌庄。

另外羹唠,Window下使用Git for windows應(yīng)該也可以實(shí)現(xiàn)對應(yīng)的操作(Windows輕松實(shí)現(xiàn)linux shell環(huán)境:gitforwindows)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娄昆,一起剝皮案震驚了整個(gè)濱河市佩微,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萌焰,老刑警劉巖哺眯,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扒俯,居然都是意外死亡奶卓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門撼玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夺姑,“玉大人,你說我怎么就攤上這事掌猛∩唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長只盹。 經(jīng)常有香客問我辣往,道長,這世上最難降的妖魔是什么殖卑? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任站削,我火速辦了婚禮,結(jié)果婚禮上孵稽,老公的妹妹穿的比我還像新娘许起。我一直安慰自己,他們只是感情好菩鲜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布园细。 她就那樣靜靜地躺著,像睡著了一般接校。 火紅的嫁衣襯著肌膚如雪猛频。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天蛛勉,我揣著相機(jī)與錄音鹿寻,去河邊找鬼。 笑死诽凌,一個(gè)胖子當(dāng)著我的面吹牛毡熏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侣诵,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼痢法,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杜顺?” 一聲冷哼從身側(cè)響起财搁,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哑舒,沒想到半個(gè)月后妇拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洗鸵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年越锈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膘滨。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甘凭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出火邓,到底是詐尸還是另有隱情丹弱,我是刑警寧澤德撬,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站躲胳,受9級特大地震影響蜓洪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坯苹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一隆檀、第九天 我趴在偏房一處隱蔽的房頂上張望垃瞧。 院中可真熱鬧劫映,春花似錦、人聲如沸判帮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孤钦,卻和暖如春歧斟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背司训。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工构捡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留液南,地道東北人壳猜。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像滑凉,于是被迫代替她去往敵國和親统扳。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文筆記源自這里——[實(shí)驗(yàn)樓]歡迎大家在下面交流其中有問題的地方喜歡請點(diǎn)收藏畅姊,每日更新(全部已親自實(shí)踐). 一. ...
    東皇Amrzs閱讀 3,971評論 7 54
  • 第一章 1.Linux是一套免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng)咒钟,它可以基于Intel x86系列處理器以及Cy...
    yansicing閱讀 5,360評論 0 9
  • 2019-04-10 星期三 晴 昨日一場中雨,滋潤了萬物若未,自然界的空氣格外清新亮麗朱嘴,柳樹上的秀發(fā)更加翠綠迷人...
    精簡執(zhí)著210715閱讀 157評論 0 2
  • 我的情感,我的好事粗合,我的明天萍嬉,我的心樂。藍(lán)建民隙疚。
    bfc125a28b54閱讀 124評論 0 1
  • 我是樊登讀書會(huì)伏寶震壤追,這是我的每日一篇文章之192篇。我寫的每一篇文章都是為了記錄我和孩子們成長的點(diǎn)點(diǎn)滴滴供屉,...
    伏寶震閱讀 280評論 0 1