bash 코드 루프를 작성하여 한 줄씩 값이 있는 파일을 읽고 첫 번째 단어를 한 줄로 읽고 csv를 생성합니다.

bash 코드 루프를 작성하여 한 줄씩 값이 있는 파일을 읽고 첫 번째 단어를 한 줄로 읽고 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);

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

관련 정보