我使用我编写的简单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_A
,File_B
,File_C
和File_B_C
,则只会生成File_A_B
和File_A_C
。请注意,File_A_B
和File_B_A
是等效的。
答案 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