bashコードループを作成して1行ずつ値を持つファイルを読み取り、最初の単語を1行に読み込み、csvを生成します。

bashコードループを作成して1行ずつ値を持つファイルを読み取り、最初の単語を1行に読み込み、csvを生成します。

このサンプルデータがあります

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*)でスカラー変数$keysumに分割されます$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

おすすめ記事