Script perl ou cmd linux pour transformation de format de texte

Fermé
doojainfo2013 Messages postés 4 Date d'inscription jeudi 31 octobre 2013 Statut Membre Dernière intervention 17 janvier 2014 - Modifié par doojainfo2013 le 31/10/2013 à 19:42
dubcek Messages postés 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 - 19 nov. 2013 à 08:51
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

A voir également:

6 réponses

dubcek Messages postés 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 5 618
Modifié par dubcek le 19/11/2013 à 08:52
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
dubcek Messages postés 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 5 618
1 nov. 2013 à 10:46
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
doojainfo2013 Messages postés 4 Date d'inscription jeudi 31 octobre 2013 Statut Membre Dernière intervention 17 janvier 2014
3 nov. 2013 à 16:52
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
dubcek Messages postés 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 5 618
Modifié par dubcek le 4/11/2013 à 09:22
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
doojainfo2013 Messages postés 4 Date d'inscription jeudi 31 octobre 2013 Statut Membre Dernière intervention 17 janvier 2014
4 nov. 2013 à 11:42
Il y a plusieurs ./PUNC d'autres catégories ;/PUNC (/PUNC :/PUNC .....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 5 618
4 nov. 2013 à 12:10
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
dubcek Messages postés 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 5 618
4 nov. 2013 à 16:12
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
doojainfo2013
18 nov. 2013 à 09:50
SVP peu tu m'expliquer en détail la commande c-à-d comment il fonctionne?
s'il est possible..
0