【问题标题】:Rename files based on the content of another file根据另一个文件的内容重命名文件
【发布时间】:2016-07-11 18:31:23
【问题描述】:

一个目录包含多个 bam,对应的 bam.bai 文件以及一个制表符分隔的 matrixkey.txt。 matrixkey 包括第一列中的条形码,这些条形码也可以在 bam/bai 文件名中找到。

For example:   Barcode001    Sample1

我想使用条形码来匹配带有样品名称的文件(位于矩阵键的第二列),并将所有文件重命名为:'barcode'_'sampleid'.bam/bam.bai 请看一下在我下面的代码中并提出改进建议。

例程运行没有错误,但文件没有被重命名。

#!/usr/bin/perl
use warnings;
use strict;
use File::Copy qw(move);

my $home="/data/";                                                     

my $bam_directory = $home."test_all_runs/Test_Runs";

my $matrix_key = $home."test_all_runs/Test_Runs/matrixkey.txt";

my @matrix_key = ();

open(TXT2, "$matrix_key");
        while (<TXT2>){  
                push (@matrix_key, $_);   
                }
close(TXT2);

my @bam_files = glob "$bam_directory/*.bam";
my @bai_files = glob "$bam_directory/*.bai";

for my $bam_file (@bam_files){

my $matrix_barcode = "";
my $matrix_sample_id = "";
        foreach (@matrix_key){
                chomp($_);
                my @matrix_key = split ("\t", $_);##  
                if (index ($bam_file,$matrix_key[0]) != -1) {
                  $matrix_barcode = $matrix_key[0]; print $matrix_key[0];
                  $matrix_sample_id = $matrix_key[1];
                  chomp $matrix_barcode;
                  chomp $matrix_sample_id;
                  move $bam_file, $bam_directory."/".$matrix_sample_id."_".$matrix_barcode.".bam";
                }       
        }

}

【问题讨论】:

  • 我不明白你的文件结构。您可以为每个涉及的文件名发布一两行内容吗? (例如,在index 中,您使用的是整个bam_file 名称——这是有意的吗?Sample1 是所述文件名吗?为什么要使用index?)查看文件是什么会有很大帮助。
  • 您正在迭代@matrix_key,并且您还使用了同名的局部变量。如果您将其重命名为其他任何内容,则不会那么混乱。
  • move $file, $new_file or die "Unable to move $file -&gt; $new_file : $!";
  • @zdim bam 和 bam.bai 文件的名称很长,不包含样本名称,而只包含条形码标识符,例如barcode1_SPN-23456-RES_IonTorrent_SDL... .bam 我使用索引来查看 bam/bai/tsv 文件是否包含与密钥文件相同的条形码,然后查找样本名称并相应更改文件名称。我上面的代码有效,但我一直在为我想要重命名的不同文件扩展名类型的循环重复相同的操作:for my $bam_file (@bam_files) … for my $bai_file(@bai_files) …for my $tsv_file(@tsv_files).

标签: perl


【解决方案1】:

在我看来,file::copy、rename 或 move 可以与直接变量一起使用,而不是与连接或方法 [::] 一起使用。

 move $bam_file, $bam_directory."/".$matrix_sample_id."_".$matrix_barcode.".bam";

改为

 my $dest_file = "$bam_directory/$matrix_sample_id\_$matrix_barcode\.bam"
 move($bam_file, $dest_file) || die "Couldn't move the files: $!..\n;

【讨论】:

    【解决方案2】:

    您可以尝试一个简单的 awk 脚本作为生成这些路径的替代方法,例如

    awk -v bam_directory=dir_name -F"\t" '{print "mv " bam_directory "/" $1 ".bam " bam_directory "/" $1 "_" $2 ".bam"}' matrixkey.txt> move_commands
    

    并在实际文件移动之前检查源文件路径

    cut -f2 -d' ' move_path |xargs  ls -l 
    

    【讨论】:

      猜你喜欢
      • 2014-07-27
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 2011-05-26
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多