#1 Le 19/04/2016, à 13:09
- jockasse
[RESOLU] (Bash) Modifier les données d'un champs dans un fichier
Bonjour,
Je fais encore appel à votre aide. J'ai un fichier délimité par des " ; " et dont le texte est délimité par des " ' ".
Je voudrais garder uniquement le nom de mon fichier dans le deuxième champs "Nom fichier".
A priori, il faudrait trouver 2 expressions régulières pour supprimer tout ce qui se trouve avant, arrivé au 3ème " \ " (pour la 1ère ligne), et supprimer tout ce qui se trouve avant, arrivé au 2ème espace (pour la 2ère ligne).
J'imagine que l'on peut faire ça avec sed ou awk ? Je patauge un peu...
Merci d'avance pour votre aide,
Joc
J'ai ce fichier :
Nombre pages transmises par RIP;Nom fichier;Date de fin;Nombre total d'images imprimées;
12;'c \paris\out\IMPRESSION_1_TRI_NEW';'01/04/16 15:38:40';12;
20;'CG type BATEAU.pdf';'01/04/16 15:43:32';NA;
Je voudrais ce résultat:
Nombre pages transmises par RIP;Nom fichier;Date de fin;Nombre total d'images imprimées;
12;'IMPRESSION_1_TRI_NEW';'01/04/16 15:38:40';12;
20;'BATEAU.pdf';'01/04/16 15:43:32';NA;
Dernière modification par jockasse (Le 20/04/2016, à 09:09)
Hors ligne
#2 Le 19/04/2016, à 13:50
- pingouinux
Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier
Bonjour,
Tu peux essayer ceci
sed -r "s/([^']+')[^']*[\ ]([^\ ]+')/\1\2/" fichier
Hors ligne
#3 Le 19/04/2016, à 14:32
- αjet
Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier
Salut,
Si je devais le faire, je m'inspirerais de cet exemple pour iterer sur le fichier csv
http://www.cyberciti.biz/faq/unix-linux … d-cvsfile/
#!/bin/bash
INPUT=data.cvs
OLDIFS=$IFS
IFS=;
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read nbpage filename date printedpages
do
INSERER CODE ICI
done < $INPUT
IFS=$OLDIFS
Une fois le champ Nom fichier isolé dans une variable, j'emploierais l'expression suivante pour recuperer la deniere partie de ton nom de fichier:
sed -r 's/^.+(\s|\\)([a-zA-Z0-9\.\_]+)\x27$/\x27\2\x27/g'
Explication: je capture n'importe quel nom de fichier (comprenant les caractères alpha numeriques, le point et underscore "_") situés a la fin du champ (avant l'apostrophe finale) et avant soit un caractere espace ou \ et je le remet la sortie (capturé par \2) entre deux apostrophe (caractère \x27).
Le code serait quelque chose comme ceci :
#!/bin/bash
INPUT=data.cvs
OUTPUT=newdata.csv
OLDIFS=$IFS
IFS=;
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read nbpage filename date printedpages
do
newfilename=$(echo $filename | sed -r 's/^.+(\s|\\)([a-zA-Z0-9\.\_]+)\x27$/\x27\2\x27/g')
echo $nbpage $IFS $newfilename $IFS $date $IFS $printedpages >> $OUTPUT
done < $INPUT
IFS=$OLDIFS
J'ai pas teste, il y a peut etre quelques erreurs...
C'est plus complique que la solution de pingouinux mais c'est peut etre plus didactique et evolutif (si tu veux par exemple faire des modifications sur un autre champ, tu peux inclure facilement de nouvelles fonctions dans la boucle principale).
Par ailleurs, pingouinux je ne comprends pas comment tu t'assures que ta regex ne modifie que le 2eme champ. Peux-tu l'expliquer un peu ? Merci
αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr
Hors ligne
#4 Le 19/04/2016, à 16:06
- jockasse
Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier
Super ! Merci beaucoup, je teste ça !
Hors ligne
#5 Le 19/04/2016, à 16:37
- pingouinux
Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier
je ne comprends pas comment tu t'assures que ta regex ne modifie que le 2eme champ. Peux-tu l'expliquer un peu ?
Je ne me suis pas cassé la tête, et ne modifie que la chaîne située entre les deux premières ' '.
([^']+') : 1 ou plusieurs caractères autres que ', suivis d'une '
[^']*[\ ] : 0 ou plus caractères autres que ', suivis d'un \ ou d'une espace => Cette portion est supprimée
([^\ ]+') : 1 ou plus caractères autres que \ ou espace, suivis d'une '
Hors ligne
#6 Le 20/04/2016, à 08:41
- credenhill
Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier
hello
$ awk 'BEGIN {FS=OFS=";"} NR>1 {$2="'\''" a[split($2, a, "[ \\\\]")]} {print}' fichier
Nombre pages transmises par RIP;Nom fichier;Date de fin;Nombre total d'images imprimées;
12;'IMPRESSION_1_TRI_NEW';'01/04/16 15:38:40';12;
20;'BATEAU.pdf';'01/04/16 15:43:32';NA;
Hors ligne
#7 Le 20/04/2016, à 09:08
- jockasse
Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier
Ca marche au top ! Merci tout le monde, j'ai l'embarras du choix
Hors ligne