Поля слияния в файле

К сожалению, нет никакого способа спросить gpg-agent является ли ключ защищенным паролем. Но Вы не должны проверять файлы, но каждый ключ однажды только. Таким образом необходимо сначала проверить, какие ключи включены. Нет никакой потребности проверить тот же ключ дважды (при помощи его для дешифрования двух файлов).

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

Редактирование 1

Взял ведущие устройства несколько минут только... Решение: --list-only

gpg --status-fd 1 --list-only --list-packets file.gpg | 
  awk '$2 == "ENC_TO" {print "0x" $3; }'

дает Вам ключевой идентификатор (идентификаторы). Прежде чем Вы попытаетесь дешифровать файл, Вы проверяете, является ли один из его ключей получателя в списке ключей, которые Вы уже проверили.

Медленная операция является асимметричным дешифрованием. Тем не менее, необходимо отсортировать файлы по размеру и запуститься с самого маленького.

Вышеупомянутая команда дает Вам подраздел (если это было зашифровано для подраздела). Если Вы хотите быть действительно хорошими затем, Вы не сравниваете подразделы, но соответствующие основные ключи. В каждой нормальной установке основной ключ и подразделы имеют тот же пароль (с GnuPG, с которым даже необходимо бороться, чтобы дать им различные пароли).

4
24.03.2014, 21:27
2 ответа

Я бы использовал Perl для решения такой сложной задачи. Вот частичное решение, возможно, вам придется подстроить его под себя:

#!/usr/bin/perl
use warnings;
use strict;
use List::Util qw{ max };

sub output {
    my $previous = shift;
    print join ' ', 'exon',
               @{$previous}{qw(start end score strand frame attribute)};
}

$\ = "\n";
my %previous;
while (<>) {
    chomp;
    my ($region, $start, $end, $score, $strand, $frame, $attribute)
        = split ' ', $_, 7;

    if ($. == 1) {
        print;

    } elsif ('exon' eq $region) {
        if (keys %previous
            and $start < $previous{end}                # Overlap.
           ) {

            if ($end > $previous{end}) {               # Not contained.
                $previous{attribute} =~ s/; Name .*//;
                $previous{attribute} .= '; ' 
                                     . ($attribute =~ /(Transcript ".*?")/)[0];
                $previous{end} = $end;
            }

        } else {
            if (keys %previous) {
                output(\%previous);
            }

            %previous = ( start     => $start,
                          end       => $end,
                          score     => $score,
                          strand    => $strand,
                          frame     => $frame,
                          attribute => $attribute,
                        );
        }

    } else {
        output(\%previous) if keys %previous;
        %previous = ();
    }
}

output(\%previous) if keys %previous;
2
27.01.2020, 20:50

Подход awk,

awk '
  $1!="exon" {                       # If the first died is unequal to "exon"
    if(previous)print previous       # If there is a previous line then print it
    print                            # Print the current line
    previous=start=end=exon_seq=""   # Set all variable to an empty string
    next                             # Move on to the next line in the input file
  }
  {
    if(exon_seq) {                   # if there is a sequence of lines with "exon in field 1
      if(start<=$2 && end>=$3)       # if the start value (field 2) of the previous line 
                                     # is less or equal to the current line and the end
                                     # value of the previous line is greater than or
                                     # equal to field 3 of the current line
        next                         # then do nothing and read the next line
      else                           # if there is no overlap,
        print previous               # then print the previous line
    }
    else {                           # if we are not already in the a sequence of 
                                     # "exon" lines, then this is the first one
      exon_seq=1                     # so exon_seq should become 1
    }
    previous=$0; start=$2; end=$3    # `start` become field2, `end` becomes field 3 and
                                     # `previous` becomes the current record (line)
  }
  END{                               # After all lines are processed
    if(previous) print previous      # If there still is a previous line, then print it
  }
' file
6
27.01.2020, 20:50

Теги

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