이 샘플 데이터가 있습니다
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);
그런 다음 키 중 하나와 일치하지 않는 줄을 무시하고 입력의 각 줄을 반복합니다. 현재 줄이 일치하면 ;
문자(선택적 선행 및/또는 후행 공백 포함 \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