transfere dados para colunas

0

inputfile contém:

dn: cn=wss_savvion
cn: users
cn: avvionvc
owner: cn=SSC_admin
owner: uid=GNG2938427

dn: cn=Web_Admin, EN=OC1Test cn: Administrators

dn: cn=sample1, cn: TestPart1,Testpart2

Precisa de um arquivo de saída como:


DN                          CN1                 CN2       OWNER            OWNER1           OWNER2      OWNER3
cn=wss_savvion              users               avvionvc  cn=SSC_admin     uid=GNG2938427
cn=Web_Admin, EN=OC1Test    Administrators
cn=sample1,                 TestPart1,Testpart2

Como você vê, os dados acima são 3 conjuntos, poucos conjuntos contêm mais cn, mais proprietários. sempre que houver mais proprietários ou cn disponíveis, ele precisa ser copiado para o Proprietário 1 ou proprietário 2 .... e assim por diante ...

alguém pode me ajudar !!!

    
por Gowtham 09.02.2017 / 16:06

1 resposta

0

Como você está no Unix Stack Exchange, presumo que seu sistema execute o Perl. A única dependência para este script é o módulo Perl 'Text :: Table' que pode ser instalado na maioria dos sistemas como:

cpan Text::Table

Dito isso, supondo que esse arquivo tenha sempre os blocos de informações separados por uma linha vazia (sem texto), o script abaixo funciona. Eu tentei ser mais detalhado do que eu normalmente sou neste script, então você pode tentar entender o que está acontecendo ou fazer modificações como você precisa. O único requisito além do módulo é que você substitua a linha my $file = '/path/to/inputfile' pelo caminho real do arquivo de entrada.

#!/usr/bin/perl
use strict;
use warnings;
use Text::Table;

my $file = '/path/to/inputfile';
my $table = process_file($file);
print $table;

sub process_file {
    my $file = shift;
    die "$file doesn't exist!" if ! -e $file;
    die "$file isn't readable" if ! -r $file;

    my @blocks;
    my $block = '';
    open(my $fh, "<", "$file") or die "Couldn't open $file: $!";
    while(<$fh>) {
        chomp $_;
        $block .= "$_\n" if $_ !~ /^\s*$/;
        if(($_ =~ m/^\s*$/ && $block ne '') || eof) {
            $block =~ s/\n$//g;
            push(@blocks, $block);
            $block = '';
        }
    }
    close $fh;

    my @rows; 
    my $max_cn = 0;    
    my $max_own = 0;
    foreach my $b (@blocks) {
        my %row = (
            'dn'    => '',
            'cn'    => [],
            'owner' => []
        );

        my @ba = split("\n", $b);
        for(@ba) {
            $_ =~ /^([a-z]+): (.+)$/;
            $row{dn} = $2 if $1 eq 'dn';
            push($row{cn}, $2) if $1 eq 'cn';
            push($row{owner}, $2) if $1 eq 'owner';
        }
        $max_cn = scalar @{$row{cn}} if $max_cn < @{$row{cn}};
        $max_own = scalar @{$row{owner}} if $max_own < @{$row{owner}};
        push(@rows, \%row);
    }

    my @headers = @{build_headers($max_cn, $max_own)};
    my $tb = Text::Table->new(@headers);
    my @inserts;
    foreach my $r (@rows) {
        push($r->{cn}, " ") until scalar @{$r->{cn}} == $max_cn;
        push($r->{owner}, " ") until scalar @{$r->{owner}} == $max_own;
        my @insert = ($r->{dn});
        push(@insert, $_) foreach @{$r->{cn}};
        push(@insert, $_) foreach @{$r->{owner}};
        push(@inserts, \@insert);
    }
    $tb->load(@inserts);
    return $tb;
}
sub build_headers {
    my $cn = shift;
    my $own = shift;
    my @headers = ("DN");
    for(my $i = 1; $i <= $cn; $i++) {
        push(@headers, "CN$i");
    }
    for(my $i = 1; $i <= $own; $i++) {
        push(@headers, "OWNER$i");
    }
    return \@headers;
}
    
por 09.02.2017 / 18:40