#!/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
)ДОЛЖЕН быть первым аргументом в командной строке.
Должен быть хотя бы один входной файл или входной файл должен быть передан в сценарий.
Примечание :только один входной файл может быть передан по конвейеру-сценарий не может узнать, какие строки являются строками заголовков, а какие строками данных, если передается более одного файла.
В этом конкретном случае то, что говорит systemd остановить службу docker, по-видимому, является автоматической -службой обновлений Ubuntu, применяющей обновления версии пакета containerd для Ubuntu. Существует открытая проблема, показывающая, что сегодня многие другие сталкиваются с той же проблемой :
.https://bugs.launchpad.net/ubuntu/+source/containerd/+bug/1870514
В этом связанном выпуске журнал включает:
Apr 03 06:09:31 server systemd[1]: Starting Daily apt upgrade and clean activities...
...
Apr 03 06:09:43 server systemd[1]: Stopping Docker Application Container Engine...
Я бы рекомендовал установить Docker из вышестоящих репозиториев Docker, в которых, похоже, нет этой проблемы: