Script perl ou cmd linux pour transformation de format de texte

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

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    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. Contributeur
      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

      $
      1. 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
        1. Contributeur
          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
          1. Il y a plusieurs ./PUNC d'autres catégories ;/PUNC (/PUNC :/PUNC .....
        2. Contributeur
          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
          $
          1. Contributeur
            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
        3. SVP peu tu m'expliquer en détail la commande c-à-d comment il fonctionne?
          s'il est possible..

          Discussions similaires

          le frigo ne marche pas....

          1 réponse