Объединить все документы в папку в определенном порядке и отсортировать объединенный вывод

Я не программист, я просто устанавливаю активный perl. где я могу найти информацию, чтобы сделать следующее.

в папке у меня есть различные txt-документы, я хочу объединить первые два и отсортировать результат стабильным образом и сохранить его как новый документ в подпапке под названием: merged.

затем выполните то же самое со следующими документами txt, другими 2 документами. таким образом, до завершения всех файлов.

файлы в каталоге выглядят следующим образом.

subtitle(english).txt
subtitle(spanish).txt
othername1(english).txt
othername1(spanish).txt
etc etc

они размещены, английская версия и испанская версия ниже, если отсортированы в алфавитном порядке.

мне нужно сначала объединить два, затем остальные (2 в то время, чтобы они не смешивали данные)

после слияния двух слияние контента будет выглядеть так:

1.- <english> hi 
1.- <spanish> hola.
2.- <english> thanks
2.- <spanish> gracias
</spanish></english></spanish></english>

потому что исходный порядок в каждом файле, например, английский.

1.- <english> hi
2.- <english> thanks
</english></english>

спасибо за имя выхода, может быть любым, или же имя, как на английском или испанском, что означает первый или второй файл.

1 ответ

Я думаю, что это должно сработать для вас, но я не могу проверить это легко.

use strict;
use warnings;
use autodie;

my @files = do {
 opendir my $dh, '.';
 sort grep /\.txt\z/, grep -f, readdir $dh;
};

my $re = qr/\A ( [^()]+? ) \s* \( \s* ( .+ ) \s* \) [^()]+ \z /ix;

my @badfiles = grep $_ !~ $re, @files;
if (@badfiles) {
 print STDERR "These file names do not match the expected pattern\n";
 print STDERR " $_\n" for @badfiles;
 print STDERR "\n";
 die "Invalid input files";
}

mkdir 'merged' unless -d 'merged';

while (@files > 1) {

 my @files = splice @files, 0, 2;
 my @fh = map { open my $fh, '<', $_; $fh } @files;
 my @details = map [ $_ =~ $re ], @files;
 my $newfile = sprintf "merged/%s(%s-%s).txt",
 $details[0][0],
 $details[0][1],
 $details[1][1];

 printf "%s + %s => %s ... ", @files, $newfile;

 open my $out_fh, '>', $newfile;
 until (grep eof, @fh) {
 print $out_fh scalar readline $_ for @fh;
 }
 close $out_fh;

 print "done\n";
}

licensed under cc by-sa 3.0 with attribution.