Переупорядочить заголовок и данные различных версий текстового файла на основе основного файла

Единственный реальный способ — рассчитать время. Я бы ожидал, что gzip *.txtсделает их по одному, так как это отдельные файлы.

Запуск их параллельно (с использованием gzip file1.txtи т. д.)может быть быстрее, но это будет зависеть от того, сколько у вас памяти, сколько ядер процессора и т. д. Наиболее важным фактором является то, что вы получите конкуренцию за диск, пока вы это делаете, и это может сильно замедлить работу (, если это не SSD, и даже в этом случае в некоторой степени ).В сумме они оба будут использовать одинаковое количество процессорного времени.

Я обычно использую gzip *.txtили аналогичный.

0
26.09.2019, 10:53
1 ответ
#!/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|

Примечание. :это не ограничивается только двумя входными файлами. Он может обрабатывать любое количество входных файлов одновременно. Есть только два ограничения:

  1. Основной справочный файл (, например.master.txt)ДОЛЖЕН быть первым аргументом в командной строке.

  2. Должен быть хотя бы один входной файл или входной файл должен быть передан в сценарий.

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

0
28.01.2020, 03:15

Теги

Похожие вопросы