입력 파일에는 다음이 포함됩니다.
dn: cn=wss_savvion CN: 사용자 cn: avvionvc 소유자: cn=SSC_admin 소유자: uid=GNG2938427dn: cn=Web_Admin, EN=OC1Test CN: 관리자
dn: cn=샘플 1, cn: 테스트 파트 1, 테스트 파트 2
출력 파일이 필요합니다. 예:
DN CN1 CN2 소유자 OWNER1 OWNER2 OWNER3 cn=wss_savvion 사용자 avvionvc cn=SSC_admin uid=GNG2938427 cn=Web_Admin, EN=OC1테스트 관리자 cn=샘플1, 테스트파트1, 테스트파트2
보시다시피 위의 데이터는 3개 그룹으로, 소수 그룹에는 더 많은 cn, 더 많은 소유자가 포함되어 있습니다. 더 많은 소유자 또는 CN을 사용할 수 있게 될 때마다 소유자1 또는 소유자2에 복사해야 합니다.... 등등...
누구든지 나를 도와줄 수 있나요?
답변1
귀하가 Unix Stack Exchange를 사용하고 있으므로 귀하의 시스템이 Perl을 실행하고 있다고 가정합니다. 스크립트의 유일한 종속성은 다음과 같이 대부분의 시스템에 설치할 수 있는 Perl 모듈 "Text::Table"입니다.
cpan Text::Table
즉, 아래 스크립트는 파일에 항상 빈(텍스트 없음) 줄로 구분된 정보 덩어리가 있다고 가정하여 작동합니다. 나는 이 스크립트에서 평소보다 더 자세히 설명하려고 노력하여 여러분이 무슨 일이 일어나고 있는지 이해하고 필요한 경우 수정할 수 있도록 노력했습니다. 모듈 이외의 유일한 요구 사항은 해당 줄을 my $file = '/path/to/inputfile'
입력 파일의 실제 경로로 바꾸는 것입니다.
#!/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;
}