чтение файлов из каталога с помощью скрипта perl

У меня есть каталог с несколькими файлами. Файлы называются следующим образом: A11111, A22222, A33333, B11111, B22222, B33333 и так далее. Я хочу прочитать эти файлы, выполнить определенные параметры форматирования содержимого и записать его в выходной файл. Но для всех файлов, начинающихся с A, мне нужен только один выходной файл, для всех файлов, начинающихся с B, мне нужен один выходной файл и так далее. Можно ли это сделать с помощью perl-скрипта?


person PSA    schedule 15.06.2012    source источник
comment
Это возможно. Что вы пробовали? Покажите свой прогресс и код. Объясните, где вы застряли без помощи других.   -  person daxim    schedule 15.06.2012
comment
Вы спрашиваете, возможно ли это или кто-нибудь здесь предоставит код для этого? это конечно возможно   -  person mathematician1975    schedule 15.06.2012
comment
С Perl возможно все!   -  person Jean    schedule 15.06.2012


Ответы (2)


Следующий пример должен стать для вас хорошим началом:

#!/usr/bin/perl

use strict;
use warnings;

my $dir = '.';

opendir my $dh, $dir or die "Cannot open $dir: $!";
my @files = sort grep { ! -d } readdir $dh;
closedir $dh;

$dir =~ s/\/$//;

foreach my $file (@files) {
  next if $file !~ /^[A-Z](\d)\1{4}$/;

  my $output = substr($file, 0, 1);
  open(my $ih, '<',  "$dir/$file")   or die "Could not open file '$file' $!";
  open(my $oh, '>>', "$dir/$output") or die "Could not open file '$output' $!";

  $_ = <$ih>;
  # perform certain formating with $_ here
  print $oh $_;

  close($ih);
  close($oh);
}

В строке next if $file !~ /^[A-Z](\d)\1{4}$/; он пропускает все имена файлов, которые не соответствуют требуемому формату, то есть первый символ — заглавная буква, второй — число, а еще 4 символа совпадают с первым числом.

person Ωmega    schedule 15.06.2012

Если вы работаете в Linux, используйте `cat файл1 файл2 ... > большой файл

в противном случае вот небольшой скрипт, который поможет вам в пути

use strict;
use warnings;

# get the directory from the commandline
# and clean ending /
my $dirname = $ARGV[0];
$dirname =~ s/\/$//;

# get a list of all files in directory; ignore all files beginning with a .
opendir(my $dh, $dirname) || die "can't opendir $dirname: $!";
my @files = grep { /^[^\.]/ && -f "$dirname/$_" } readdir($dh);
closedir $dh;

# loop through the files and write all beginning with 
# A to file A, B to file B, etc. extent the regex to fit your needs 
foreach my $file (@files) {
    if ($file =~ /([AB])\d+/) {
        open(IN,  "< $dirname/$file") or die "cant open $dirname/$file for reading";
        open(OUT, ">> $dirname/$1") or die "cant open $dirname/$1 for appending";
        print OUT <IN>;
        close(OUT);
        close(IN); 
    } else {
        print "$file didn't match\n";
    }
}
person pulven    schedule 15.06.2012