Укороченная версия, в которой мы не присваиваем пустые значения нулю:
perl -lane '
++$h{$i[!$h{$F[0]} ? @i : -1]=$F[0]}{$F[1]}}{
print join "\t", "\t", @h = sort keys %{ +{ map { map { $_ => 1 } keys %$_ } values %h } };
print join "\t", $_, @{$h{$_}}{@h} for @i;
' yourfile
perl -lane '
$i[@i]=$F[0] unless $h{$F[0]};
++$h{$F[0]}{$F[1]}}{
@h = sort keys %{ +{ map { map { $_ => 1 } keys %$_ } values %h } };
print join "\t", "\t", @h;
for my $date ( @i ) {
my $href = $h{$date};
print join "\t", $date, map { $href->{$_} || 0 } @h;
}
' yourfile
A B C
2017-07-30 3 2 1
2017-07-31 1 2 2
%h
, который имеет keys
даты и значения, суб-хэши -с ключами A, B, C и т. д., а соответствующие значения являются их соответствующими подсчетами в эти конкретные даты. %h = (
2017-07-30 => {
A => 3,
B => 2,
C => 1,
},
...
);
@i
, в котором хранятся даты в порядке их появления. Мы проталкиваем даты в массив @i
только тогда, когда они не были замечены ранее IOW, когда они были замечены только в первый раз. Порядок обеспечивается позицией массива. @h
имеет уникальные ключи после суммирования всех ключей «A», «B», «C» и т. д. из хэша %h
. Вам придется удалить всю пользовательскую среду, которая выполняет множество автоматизаций (systemd, udev et al. ), так что создайте минимальный initramfs только с busybox и ddrescue (или другими инструментами, которые вам нужны ). Вы можете использовать это руководство для справки:https://wiki.gentoo.org/wiki/Custom_Initramfs
Кроме того, вам придется скомпилировать специальное ядро, которое не поддерживает таблицы разделов, иначе само ядро само попытается прочитать их автоматически.
Это необычная конфигурация, так как люди, конечно, хотят, чтобы их разделы отображались, поэтому обычно все ядра имеют для них значение «да»:
CONFIG_MSDOS_PARTITION=y # for old school dos/mbr partitions
CONFIG_EFI_PARTITION=y # for new GPT/UEFI partitions
# but there are many others like:
CONFIG_AIX_PARTITION=y
CONFIG_MAC_PARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
Чтобы избавиться от чтения жесткого диска ядром, вы должны отключить все это. Сделайте ядро, которое не поддерживает таблицы разделов любого типа.
И даже в этом случае вам, вероятно, следует сначала загрузить собственное ядро + initramfs, прежде чем -подключать диск в горячем режиме. В противном случае BIOS уже просканирует устройство на наличие загрузочных разделов. Вы можете отключить это, но у вас нет прямого контроля над этим.
Удачи в выздоровлении.
is there a kernel configuration option I need to set in order to stop all automatic reads to the drive?
Параметр ядра сделал бы это намного проще, но я не знаю такого. В лучшем случае вы можете полностью занести устройство в черный список, заставив его исчезнуть. Может быть полезно для мертвого встроенного -устройства, от которого вы просто хотите избавиться, но тогда вы также ничего не сможете восстановить из него.