美文网首页R语言
批量重命名:linux不会,不如用R吧

批量重命名:linux不会,不如用R吧

作者: 小洁忘了怎么分身 | 来源:发表于2019-06-11 21:35 被阅读15次

问题

今天老板抛了一道题给所有的学习者,用linux实现指定的重命名,题目是这样:

根据下面的对应关系,首先 touch这些gz文件出来,然后 shell脚本改名
比如 SRR6269851_1.fastq.gz 改名为 P3_DCIS_Exome_1.fastq.gz
以此类推

Library_Name Run
P3_DCIS_Exome SRR6269851
P4_DCIS_Exome SRR6269852
P1_DCIS_Exome SRR6269853
P2_DCIS_Exome SRR6269854
P7_DCIS_Exome SRR6269855
P5_DCIS_Exome SRR6269856
P8_DCIS_Exome SRR6269857
P6_DCIS_Exome SRR6269858
P10_DCIS_Exome SRR6269859
P9_DCIS_Exome SRR6269860
P3_INV_Exome SRR6269861
P4_INV_Exome SRR6269862
P2_INV_Exome SRR6269863
P1_INV_Exome SRR6269864
P7_INV_Exome SRR6269865
P8_INV_Exome SRR6269866
P5_INV_Exome SRR6269867
P6_INV_Exome SRR6269868
P9_INV_Exome SRR6269869
P10_INV_Exome SRR6269870
P10_Norm_Exome SRR6269871
P9_Norm_Exome SRR6269872
P4_Norm_Exome SRR6269873
P3_Norm_Exome SRR6269874
P2_Norm_Exome SRR6269875
P1_Norm_Exome SRR6269876
P8_Norm_Exome SRR6269877
P7_Norm_Exome SRR6269878
P6_Norm_Exome SRR6269879
P5_Norm_Exome SRR6269880

思路

我好像没有长linux的脑回路。想到的是R语言for循环一圈搞定。。。。。
1.由于没有原始数据,所以批量生成文件,linux用touch,R可以用write.table(应该有别的函数吧,我试了一下可以就是可以。)
2.linux的遍历是ls,R是dir(),可以用partten参数结合正则表达式选择性显示文件。
3.linux的改名是mv函数,R是file.rename
4.然后就是for循环走起

动手!

30个太多。循环之前先用三个数据试一下。
直接手动在这里新建三个空文件,命名为a.txt,b.txt,c.txt。没有内容没关系,我们要的是文件名。



右下角长这样

试着把这三个名字改成大写的,"A.txt" "B.txt" "C.txt"。

将要修改的旧文件名存为向量x,新文件名存为向量y

x=dir(pattern = "*.txt");x
#[1] "a.txt" "b.txt" "c.txt"
y=paste0(LETTERS[1:3],".txt");y
#[1] "A.txt" "B.txt" "C.txt"

一个for循环,直接打哭

for (i in 1:length(x)){
  file.rename(x[[i]],y[[i]])
}

已经完成。看看右下角的file框,或者代码查看

dir(pattern = "*.txt")
[1] "A.txt" "B.txt" "C.txt"

循环畅通,那么30个就不成问题了。

乾坤大挪移

把题目里的两列文件名存为一个toc.txt,然后读取它。
思路是一样的。一顿操作猛如虎,还好没有原地杵。

x=read.table("toc.txt",header = T);head(x)
# Library_Name        Run
# 1 P3_DCIS_Exome SRR6269851
# 2 P4_DCIS_Exome SRR6269852
# 3 P1_DCIS_Exome SRR6269853
# 4 P2_DCIS_Exome SRR6269854
# 5 P7_DCIS_Exome SRR6269855
# 6 P5_DCIS_Exome SRR6269856
for (i in 1:nrow(x)){
     write.table(x[i,1],file=paste0(x[i,2],".fastq.gz"))
   }
test=dir(pattern = "SRR*");head(test)
# [1] "SRR6269851.fastq.gz"
# [2] "SRR6269852.fastq.gz"
# [3] "SRR6269853.fastq.gz"
# [4] "SRR6269854.fastq.gz"
# [5] "SRR6269855.fastq.gz"
# [6] "SRR6269856.fastq.gz"
y=paste0(x[,1],".fastq.gz");head(y)
# [1] "P3_DCIS_Exome.fastq.gz"
# [2] "P4_DCIS_Exome.fastq.gz"
# [3] "P1_DCIS_Exome.fastq.gz"
# [4] "P2_DCIS_Exome.fastq.gz"
# [5] "P7_DCIS_Exome.fastq.gz"
# [6] "P5_DCIS_Exome.fastq.gz"
for (i in 1:length(test)) {
     file.rename(test[[i]],y[[i]])
}

dir(pattern = "*.fastq.gz")
# [1] "P1_DCIS_Exome.fastq.gz" 
# [2] "P1_INV_Exome.fastq.gz"  
# [3] "P1_Norm_Exome.fastq.gz" 
# [4] "P10_DCIS_Exome.fastq.gz"
# [5] "P10_INV_Exome.fastq.gz" 
# [6] "P10_Norm_Exome.fastq.gz"
# [7] "P2_DCIS_Exome.fastq.gz" 
# [8] "P2_INV_Exome.fastq.gz"  
# [9] "P2_Norm_Exome.fastq.gz" 
# [10] "P3_DCIS_Exome.fastq.gz" 
# [11] "P3_INV_Exome.fastq.gz"  
# [12] "P3_Norm_Exome.fastq.gz" 
# [13] "P4_DCIS_Exome.fastq.gz" 
# [14] "P4_INV_Exome.fastq.gz"  
# [15] "P4_Norm_Exome.fastq.gz" 
# [16] "P5_DCIS_Exome.fastq.gz" 
# [17] "P5_INV_Exome.fastq.gz"  
# [18] "P5_Norm_Exome.fastq.gz" 
# [19] "P6_DCIS_Exome.fastq.gz" 
# [20] "P6_INV_Exome.fastq.gz"  
# [21] "P6_Norm_Exome.fastq.gz" 
# [22] "P7_DCIS_Exome.fastq.gz" 
# [23] "P7_INV_Exome.fastq.gz"  
# [24] "P7_Norm_Exome.fastq.gz" 
# [25] "P8_DCIS_Exome.fastq.gz" 
# [26] "P8_INV_Exome.fastq.gz"  
# [27] "P8_Norm_Exome.fastq.gz" 
# [28] "P9_DCIS_Exome.fastq.gz" 
# [29] "P9_INV_Exome.fastq.gz"  
# [30] "P9_Norm_Exome.fastq.gz" 

相关文章

网友评论

    本文标题:批量重命名:linux不会,不如用R吧

    本文链接:https://www.haomeiwen.com/subject/jevcfctx.html