自动配对分析

时间:2014-05-23 20:38:43

标签: perl bash

我使用我编写的简单Perl脚本处理越来越多的文件。该脚本将两个文件作为输入并打印输出。我想使用bash脚本(或任何真正的东西)来自动执行以下用法:

perl Program.pl GeneLevels_A GeneLevels_B > GeneLevels_A_B

与特定目录中的每个配对,非定向文件组合。

这是Perl脚本:

    #!/usr/bin/perl

    use strict;
    use warnings;

    die "Usage: $0 <File_1> <File_2>\n" unless @ARGV == 2;

    my $file1 = shift @ARGV;
    my $file2 = shift @ARGV;
    my %hash1;
    my %hash2;
    my $counter = 0;
    my $amt = 25;
    my $start = 244 - $amt;

    open (REF, $file1);
    while (<REF>) {
           my $line = $_;
           chomp $line;
           if ($counter < $start) {
                   $counter++;
                    next;
            }
            my @cells = split('\t', $line);
            my $ID = $cells[2];
            my $row = $cells[0];
            $hash1{$ID} = $row;
            $counter++;

    }
    close REF;
    $counter = 0;

    open (FILE, $file2);
    while (<FILE>) {
            my $line = $_;
            chomp $line;
            if ($counter < $start) {
                    $counter++;
                    next;
            }
            my @cells = split('\t', $line);
            my $ID = $cells[2];
            my $row = $cells[0];
            $hash2{$ID} = $row;
            $counter++;

    }
    close FILE;

    while ( my ($key, $value) = each(%hash1) ) {
             if ( exists $hash2{$key} ) {
                    print "$key\t$value\t$hash2{$key}\n";
            }
    }

一个好的解决方案将允许我在每个具有适当后缀的文件上运行Perl脚本。

更好的解决方案是评估现有文件的后缀,以确定哪些文件对已经以这种方式处理并省略。例如,如果存在File_AFile_BFile_CFile_B_C,则只会生成File_A_BFile_A_C。请注意,File_A_BFile_B_A是等效的。

1 个答案:

答案 0 :(得分:0)

这应该有效。更好地检查错误的参数将是一件好事:

#!/bin/bash
if [ $# != 2 ]; then
   echo "usage: pair <suffix1> <suffix2>"
   exit
fi
suffix1=$1
suffix2=$2

for file1 in *_${suffix1}; do
   fileCheck=$(echo $file1 | sed -e "s@_$suffix2@@")
   if [ "$fileCheck" = "$file1" ]; then
      file2=${file1/_$suffix1/_$suffix2}
      if [[ ( ! -f ${file1}_${suffix2} ) && ( ! -f ${file2}_${suffix1} ) ]]; then
         echo processing ${file1}_${suffix2}
         perl Program.pl $file1 $file2 > ${file1}_${suffix2}
      fi
   fi
done