Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/04/2016, à 14: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, à 10:09)

Hors ligne

#2 Le 19/04/2016, à 14: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, à 15: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 smile


α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, à 17:06

jockasse

Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier

Super ! big_smile Merci beaucoup, je teste ça !

Hors ligne

#5 Le 19/04/2016, à 17:37

pingouinux

Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier

αjet #3 a écrit :

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, à 09: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, à 10:08

jockasse

Re : [RESOLU] (Bash) Modifier les données d'un champs dans un fichier

Ca marche au top ! big_smile Merci tout le monde, j'ai l'embarras du choix cool

Hors ligne