このサンプルデータがあります
dn; uid=456456456,cn=users,dc=efsfb,dc=org,dc=co;
objectclass; top;
objectclass; person;
objectclass; organizationalPerson;
objectclass; inetOrgPerson;
uid; 456456456;
givenName; MONICA;
employeeType; CC;
telephoneNumber;456456456;
telexNumber;958;
postalAddress;19770726;
initials; ARBOLEDA;
title; F;
cn; MONICA ARBOLEDA RAIGOSA;
mail; [email protected];
sn; RAIGOSA;
userPassword;;
ibm-entryuuid;;
;;
dn; uid=456456,cn=users,dc=efsfb,dc=org,dc=co;
objectclass; top;
objectclass; person;
objectclass; organizationalPerson;
objectclass; inetOrgPerson;
uid; 456456456;
givenName; SONIA ESPERANZA;
employeeType; CC;
telephoneNumber;456456;
telexNumber;958;
postalAddress;456456;
initials; CASTRO;
employeeNumber;51932787;
title; F;
cn; SONIA ESPERANZA CASTRO TORRES;
mail; [email protected];
sn; TORRES;
userPassword;;
ibm-entryuuid;;
;;
dn; uid=456456,cn=users,dc=efsfb,dc=org,dc=co;
objectclass; top;
objectclass; person;
objectclass; organizationalPerson;
objectclass; inetOrgPerson;
uid; 456456;
userpassword;;
sn; OLIVERA;
givenName; MAURICIO;
cn; MAURICIO REINALES OLIVERA;
employeeType; CC;
mail; [email protected];
telephoneNumber;57383;
telexNumber;958;
postalAddress;19800101;
initials; REINALES;
employeeNumber;456456;
title; M;
ibm-entryuuid;;
;;
dn; uid=CC39681904,cn=users,dc=efsfb,dc=org,dc=co;
objectclass; top;
objectclass; person;
objectclass; organizationalPerson;
objectclass; inetOrgPerson;
uid; CC39681904;
givenName; MARIA DEL PILAR;
employeeType; CC;
telephoneNumber;217001;
telexNumber;958;
postalAddress;456456;
initials; ACUNA;
employeeNumber;456456;
title; F;
cn; MARIA DEL PILAR ACUNA PENA;
mail; [email protected];
sn; PENA;
userPassword;;
ibm-entryuuid;;
;;
ご覧のとおり、重複した内容ではありません。一部にはデータがある場合もあり、一部はない場合もありますが、共通点は区切り文字 ";"前の最初の言葉は行だということです。
この例のように、古いデータをすべてcsvに変換するにはどうすればよいですか?
uid employeeType name email
mafsdfsf cc maur mafsdf
mafsdfsf CC5dfgdfg8 monica modfgfdg@g
blabla blabla blabla blabla
私はawk、IFS、readarrayを読みましたが、取引を実現することはできません。
私を助けることができる人のおかげで
しかし、この場合、すべてのフィールド
答え1
パールを使用してください。 LDAPデータを解析するPerlモジュールがあるかもしれませんが、あえて見つかりませんでした。検索も簡単で、モジュールも必要ありません。
しかし、カンマで区切られた値ではなく、タブで区切られた値が欲しいようです。それに応じてスクリプト名を指定しました。実際のCSVが必要な場合は簡単に変更できます(ただし、各フィールドを二重引用符で囲む必要があることに注意してください。dn
特にフィールドにすでにカンマが含まれている場合)。テキスト::CSVモジュールは正しいCSV出力を生成します)。
$ cat ldap2tsv.pl
#!/usr/bin/perl
use strict;
my @keys = qw(dn uid mail); # array of keys we're interested in
my $match = '^(' . join("|",@keys) . ');'; # turn @keys array into a regex
$match = qr($match); # pre-compile regex for performance
my %data = (); # hash to hold values for each key
print join("\t", @keys), "\n"; # print header line
while(<<>>) {
next unless m/$match/;
my ($key,$val) = split /\s*;\s*/;
$data{$key} = $val;
} continue {
if (m/^;;$/ || eof) {
print join("\t", @data{@keys}), "\n";
%data = ();
};
};
まず、関心のあるキー名を含む配列を作成し、配列のキー名と一致する正規表現を作成してプリコンパイルし、ヘッダー行にキーを印刷します。 $match
最後に、正規表現が含まれます。^(dn|uid|mail);
次に、キーの1つと一致しない行を無視し、入力の各行を繰り返します。現在の行が一致すると、;
文字(オプションの先行および/または末尾のスペースを含む\s*
)でスカラー変数$key
sumに分割されます$val
。これは、現在行のデータを%data
ハッシュに挿入するために使用されます。
このcontinue
ブロックは各行の後に実行されます。ここでは、行にコンテンツのみが含まれているか、ファイルの;;
末尾にあるかどうかを確認するために使用します。その場合は、現在のデータ行を印刷して%dataの現在の値を消去します。
出力例:
$ chmod +x ./ldap2tsv.pl
$ ./ldap2tsv.pl data.txt
dn uid mail
uid=remisor1,cn=users,dc=efsfb,dc=org,dc=co remisor1
uid=paciente1,cn=users,dc=efsfb,dc=org,dc=co paciente1
uid=CC522496sdad48,cn=users,dc=efsfb,dc=org,dc=co CC5dfgdfg8 [email protected]
出力をうまく整列した列に表示するには、 にパイプすることができますcolumn -t
。ただし、これによりタブが複数のスペースに変換されます。
$ ./ldap2csv.pl data.txt | column -t
dn uid mail
uid=remisor1,cn=users,dc=efsfb,dc=org,dc=co remisor1
uid=paciente1,cn=users,dc=efsfb,dc=org,dc=co paciente1
uid=CC522496sdad48,cn=users,dc=efsfb,dc=org,dc=co CC5dfgdfg8 [email protected]
my @keys = qw(dn uid mail);
行を変更して新しいデータセットに対して実行した後、my @keys = qw(uid employeeType givenName mail);
出力は次のようになります。
$ ./ldap2csv.pl data2.txt
uid employeeType givenName mail
456456456 CC MONICA [email protected]
456456456 CC SONIA ESPERANZA [email protected]
456456 CC MAURICIO [email protected]
CC39681904 CC MARIA DEL PILAR [email protected]
または人が読むのに良い形式ですcolumn -s $'\t' -t
。
$ ./ldap2csv.pl data2.txt | column -s $'\t' -t
uid employeeType givenName mail
456456456 CC MONICA [email protected]
456456456 CC SONIA ESPERANZA [email protected]
456456 CC MAURICIO [email protected]
CC39681904 CC MARIA DEL PILAR [email protected]
メモ:name
お客様のデータには鍵がありません。鍵がありますgivenName
。代わりに使ってみました。同じemail
- 鍵はありませんが、鍵email
があります。mail