Script perl ou cmd linux pour transformation de format de texte

doojainfo2013 Messages postés 4 Statut Membre -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
je veux savoir s'il y a des commande linux pour transformer un texte d'un format à un autre format précisé comme par exemple le fichier contient le texte:
[P1 m1/NNP m2/NNP m3/NNP] [P2 m4/NN m5/JJ m6/JJ] [P3 m7/VBN_MS3] [P4 m8/NN] [P5 m9/NNCD] [P6 m10/NN] [P7 m11/IN m12/NN_FS m13/NNP] ./PUNC .......
transformer au fichier de format suivant:
m1 NNP B-P1
m2 NNP I-P1
m3 NNP I-P1
m4 NN B-P2
m5 JJ I-P2
m6 JJ I-P2
m7 VBN_MS3 B-P3
m8 NN B-P4
m9 NNCD B-P5
m10 NN B-P6
m11 IN B-P7
m12 NN_FS I-P7
m13 NNP I-P7
. PUNC O
. . .
. . .
. . .

SVP qlq me aide

6 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    voici
    BEGIN {RS="^[[]|[]] [[]| [^A-Z]/|\n|[]]"} on definit comme séparateur d'enregistrement : ^[ ou ]<espace>[ ou <espace>[pas de lettre] ou \n ou ] donc $0=P1 m1/NNP m2/NNP m3/NNP
    NF>1 pour tout enreg. avec 2 champs ou plus
    {for(n=2; n<=NF;) pour chaque champ (sauf le 1er) du genre m1/NNP
    {split($n, a, "/") on sépare avant et après le /
    n++>2? c="I": c="B"; si c'est le 2ème champ on imprimera B sinon I
    print a[1], a[2], c "-" $1}} on imprime
    NF==1 {print ".", $0, "O"} si il n'y a qu'un champ (/PUNC) on imprime
    1
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    $ awk -v RS="[][]" '/P[0-9]/ {for(n=2; n<=NF;){split($n, a, "/"); n++>2? c="I": c="B"; print a[1], a[2], c "-" $1}; next} NF' fichier
    m1 NNP B-P1
    m2 NNP I-P1
    m3 NNP I-P1
    m4 NN B-P2
    m5 JJ I-P2
    m6 JJ I-P2
    m7 VBN_MS3 B-P3
    m8 NN B-P4
    m9 NNCD B-P5
    m10 NN B-P6
    m11 IN B-P7
    m12 NN_FS I-P7
    m13 NNP I-P7
    ./PUNC

    $
    0
  3. doojainfo2013 Messages postés 4 Statut Membre
     
    Merci
    Mais c'est quoi NF? tu peux m'expliquer un peut tous ta ligne de commande ... car je suis débutant.
    pour les points " ./PUNC" lorsque on les trouve dans le fichier on veux transférer en:
    . PUNC O
    0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    il n'y a qu'une ligne ./PUNC ou plusieurs ?
    NF tout seul veut dire:
    if(NF != 0)print $0
    si le nombre de champs (NF) n'est pas nul, donc si la ligne n'est pas vide, on l'imprime
    0
    1. doojainfo2013 Messages postés 4 Statut Membre
       
      Il y a plusieurs ./PUNC d'autres catégories ;/PUNC (/PUNC :/PUNC .....
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    comme ça ?
    $ cat fichier
    [P1 m1/NNP m2/NNP m3/NNP] [P2 m4/NN m5/JJ m6/JJ] [P3 m7/VBN_MS3] [P4 m8/NN] [P5 m9/NNCD] [P6 m10/NN] [P7 m11/IN m12/NN_FS m13/NNP] ./PUNC ;/PUNC (/PUNC :/PUNC
    $ awk 'BEGIN {RS="^[[]|[]] [[]| [^A-Z]/"} NF>1 {for(n=2; n<=NF;){split($n, a, "/"); n++>2? c="I": c="B"; print a[1], a[2], c "-" $1}} NF==1 {sub("\n", ""); print ".", $0, "O"}' fichier
    m1 NNP B-P1
    m2 NNP I-P1
    m3 NNP I-P1
    m4 NN B-P2
    m5 JJ I-P2
    m6 JJ I-P2
    m7 VBN_MS3 B-P3
    m8 NN B-P4
    m9 NNCD B-P5
    m10 NN B-P6
    m11 IN B-P7
    m12 NN_FS I-P7
    m13 NNP] I-P7
    . PUNC O
    . PUNC O
    . PUNC O
    . PUNC O
    $
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      correction
      awk 'BEGIN {RS="^[[]|[]] [[]| [^A-Z]/|\n|[]]"} NF>1 {for(n=2; n<=NF;){split($n, a, "/"); n++>2? c="I": c="B"; print a[1], a[2], c "-" $1}} NF==1 {print ".", $0, "O"}' fichier
      il restait un ] là :
      m13 NNP] I-P7
      0
  7. doojainfo2013
     
    SVP peu tu m'expliquer en détail la commande c-à-d comment il fonctionne?
    s'il est possible..
    0