Единственный реальный способ — рассчитать время. Я бы ожидал, что gzip *.txt
сделает их по одному, так как это отдельные файлы.
Запуск их параллельно (с использованием gzip file1.txt
и т. д.)может быть быстрее, но это будет зависеть от того, сколько у вас памяти, сколько ядер процессора и т. д. Наиболее важным фактором является то, что вы получите конкуренцию за диск, пока вы это делаете, и это может сильно замедлить работу (, если это не SSD, и даже в этом случае в некоторой степени ).В сумме они оба будут использовать одинаковое количество процессорного времени.
Я обычно использую gzip *.txt
или аналогичный.
#!/usr/bin/perl
use strict;
my $master = shift;
open(M,"<","$master") || die "couldn't open $master:$!\n";
chomp(my @master = split(/\|/,<M>));
close(M);
print join("|",@master),"\n";
my @fields=();
while (<>) {
if ($. == 1) {
chomp(@fields = split /\|/);
next;
};
chomp(my @row = split/\|/);
my @out = ();
foreach my $m (@master) {
my $o='';
for (my $i=0; $i < $#row; $i++) {
if ($fields[$i] eq $m) {
$o = $row[$i];
};
}
push @out, $o;
};
print join("|",@out),"\n";
} continue {
close ARGV if eof; # reset the line counter after each input file
}
Это считывает основной файл ссылки (, который должен быть первым аргументом в командной строке ), и разбивает его на массив (@master ), содержащий имена полей..
После этого он считывает все оставшиеся аргументы имени файла и:
@fields
@row
и выполните цикл по @master и каждому элементу @row
. Когда поле имя элемента строки соответствует элементу в @master, добавьте значение этого поля в выходной массив (@out ), в противном случае добавьте пустую строку. @out
, соединенный |
символами. @out
сбрасывается в пустое значение для каждой строки ввода. Сохраните его как, например, rearrange.pl
, сделайте его исполняемым с помощью chmod +x rearrange.pl
и запустите как:
$./rearrange.pl master.txt input1.txt input2.txt
State|City|Vehicle|Gender|Name|Amount
|Altamonte|Volkswagen||Jack|123.22
||Audi||Sam|23.1
|NewYork|Ford|||21.4
NJ|Hoboken|Volkswagen||Jack|
|Stamford|Buick||Rob|
Примечание. :это не ограничивается только двумя входными файлами. Он может обрабатывать любое количество входных файлов одновременно. Есть только два ограничения:
Основной справочный файл (, например.master.txt
)ДОЛЖЕН быть первым аргументом в командной строке.
Должен быть хотя бы один входной файл или входной файл должен быть передан в сценарий.
Примечание :только один входной файл может быть передан по конвейеру-сценарий не может узнать, какие строки являются строками заголовков, а какие строками данных, если передается более одного файла.