#1 Le 07/04/2016, à 15:36
- jockasse
[RESOLU] (Bash) Lire une ligne d'un fichier texte
Bonjour à tous,
J'ai un problème pour extraire le texte d'une fichier délimité par --> :
Le problème c'est que --> : sert à définir l'heure... et je ne sait pas comment dire au programme de ne pas chercher dans cette zone délimitée par des apostrophes --> '
J'ai un fichier de ce style là :
Identifiant:Prenom_Nom:Date_et_Heure_Jour:Adresse:Date_et_Heure_Nuit:
0151:JEAN_ROBERT:'01/04/16 15:43:58':monadresse:'01/04/16 02:43:58':
Le séparateur de champs est --> :
L'identificateur de texte sont des apostrophes --> '
Je veux afficher ce résultat dans la console
Identifiant Prenom_Nom Date_et_Heure
0151 JEAN_ROBERT 01/04/16 15:43:58
...
#!/bin/bash
exec 5< monfichier
while read lig 0<&5
do
Identifiant=`echo $lig | cut -d: -f1`
Prenom_Nom=`echo $lig | cut -d: -f2`
Date_et_Heure_Jour=`echo $lig | cut -d: -f3`
Adresse=`echo $lig | cut -d: -f4`
Date_et_Heure_Nuit=`echo $lig | cut -d: -f5`
echo "| $Identifiant | $Prenom_Nom | $Date_et_Heure_Jour"
done
Ce que me donne mon programme pour les 3 premiers champs par exemple...
Identifiant Prenom_Nom Date_et_Heure_Jour Adresse Date_et_Heure_Nuit
0151 JEAN_ROBERT 01/04/16 15
Merci d'avance pour votre aide,
Joc
Dernière modification par jockasse (Le 08/04/2016, à 15:51)
Hors ligne
#2 Le 07/04/2016, à 16:03
- Watael
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
salut,
le fichier a toujours 3 champs ?
while IFS=':' read -r ch1 ch2 ch3
do
echo "$ch1 | $ch2 | $ch3"
done < fichier
Dernière modification par Watael (Le 07/04/2016, à 16:03)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 07/04/2016, à 16:11
- jockasse
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Bonjour,
Merci pour l'aide. Non le fichier en a beaucoup plus !
Du coup, ça ne marche pas avec cette solution.
Hors ligne
#4 Le 07/04/2016, à 17:00
- pingouinux
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Bonjour,
Dans ce cas, montre le fichier complet, ou du moins un échantillon représentatif.
Hors ligne
#5 Le 07/04/2016, à 17:21
- jockasse
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Bonjour,
J'ai ajouté 2 champs supplémentaires pour que ce soit plus compréhensible.
Merci
Dernière modification par jockasse (Le 07/04/2016, à 17:21)
Hors ligne
#6 Le 07/04/2016, à 17:57
- pingouinux
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Essaye ceci :
sed -r "s/([^:]+):([^:]+):('([^']+)'|([^:]+)):?.*/\1 | \2 | \3/" monfichier
Hors ligne
#7 Le 07/04/2016, à 19:20
- jockasse
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Merci ! J'essaye ça demain matin sur mes données ! L'expression à l'air bien compliquée en tout cas, il va falloir que je bosse sérieusement le bash...
Hors ligne
#8 Le 07/04/2016, à 20:31
- Watael
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
il va falloir que je bosse sérieusement le bash...
d'autant plus que sed n'est pas bash
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 08/04/2016, à 08:58
- credenhill
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
hello
$ gawk -v FPAT="([^:]+)|('[^']+')" '{gsub("'\''", "", $3); print $1, $2, $3}' fichier
Identifiant Prenom_Nom Date_et_Heure_Jour
0151 JEAN_ROBERT 01/04/16 15:43:58
Hors ligne
#10 Le 08/04/2016, à 11:10
- jockasse
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Merci pour vos réponses, ça marche très bien !
Par contre, j'ai un fichier similaire avec des trous dans les données.
Comme l'exemple suivant avec la donnée JEAN ROBERT absente.
Identifiant:Prenom_Nom:Date_et_Heure_Jour:Adresse:Date_et_Heure_Nuit:
0151::'01/04/16 15:43:58':monadresse:'01/04/16 02:43:58':
Du coup, je cherche pour avoir cet affichage (donnée manquante à la place de JEAN ROBERT)
Identifiant Prenom_Nom Date_et_Heure_Jour Adresse Date_et_Heure_Nuit
0151 '01/04/16 15:43:58' monadresse '01/04/16 02:43:58'
Si j'applique votre code, j'ai un décalage :
Identifiant Prenom_Nom Date_et_Heure_Jour Adresse Date_et_Heure_Nuit
0151 '01/04/16 15:43:58' monadresse '01/04/16 02:43:58' [u][b]donnéeAutreColonne[/b][/u]
Merci d'avance pour votre aide (je cherche toujours...),
Joc
Dernière modification par jockasse (Le 08/04/2016, à 11:10)
Hors ligne
#11 Le 08/04/2016, à 11:27
- credenhill
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
comment faut-il afficher un champ vide ?
$ cat fichier
Identifiant:Prenom_Nom:Date_et_Heure_Jour:Adresse:Date_et_Heure_Nuit:
0151::'01/04/16 15:43:58':monadresse:'01/04/16 02:43:58':
$ gawk -v FPAT="([^:]*)|('[^']+')" '{gsub("'\''", "", $3); print $1, $2, $3}' fichier
Identifiant Prenom_Nom Date_et_Heure_Jour
0151 01/04/16 15:43:58
Dernière modification par credenhill (Le 08/04/2016, à 11:27)
Hors ligne
#12 Le 08/04/2016, à 12:22
- jockasse
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Super !
Je suis preneur de la solution, pour remplacer un champs vide par un 'Not Available'.
Merci
Hors ligne
#13 Le 08/04/2016, à 12:35
- pingouinux
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Ceci ?
sed -r "s/: *:/:Not Available:/g;s/([^:]*):([^:]*):('([^']+)'|([^:]+)):?.*/\1 | \2 | \4\5/" monfichier
Édité : Petit changement
Et si tu ne veux pas de séparateurs
sed -r "s/: *:/:Not Available:/g;s/([^:]*):([^:]*):('([^']+)'|([^:]+)):?.*/\1 \2 \4\5/" monfichier
Dernière modification par pingouinux (Le 08/04/2016, à 12:48)
Hors ligne
#14 Le 08/04/2016, à 13:47
- jockasse
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Merci pingouinux,
Oui ça marche très bien quand il n'y a qu'un champs vide, mais dès qu'il y en a 2 de vides à la suite ça ne délimite pas bien.
Là, c'est OK
Identifiant:Prenom_Nom:Date_et_Heure_Jour:Adresse:Date_et_Heure_Nuit:
0151::'01/04/16 15:43:58':monadresse:'01/04/16 02:43:58':
Là c'est KO, si je supprime la première date par exemple.
Identifiant:Prenom_Nom:Date_et_Heure_Jour:Adresse:Date_et_Heure_Nuit:
0151:::monadresse:'01/04/16 02:43:58':
J'ai une petite question. Je ne comprends pas trop la logique pour cette partie du code :
\1 | \2 | \4\5
Je comprends bien que ça permet d'afficher les 3 premières colonnes. Mais si je fais \1 | \2 | \3 ça marche aussi.
Par contre, je n'arrive pas à afficher les 5 colonnes... D'où ma question, que veut dire \4\5 ?
Merci encore,
Joc
Dernière modification par jockasse (Le 08/04/2016, à 13:48)
Hors ligne
#15 Le 08/04/2016, à 14:32
- pingouinux
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Avec \3 (par rapport à \4\5), tu récupères en plus les ' ' qui entourent la date.
Les numéros se réfèrent à l'ordre des parenthèses ouvrantes dans la chaîne de recherche.
Pour les champs vides consécutifs, je regarderai plus tard, si credenhill n'a pas donné une solution d'ici là. J'en profite pour le remercier de l'utilisation (que je ne connaissais pas) de FPAT dans awk.
Hors ligne
#16 Le 08/04/2016, à 15:36
- credenhill
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
comme ca ?
$ gawk -v FPAT="([^:]*)|('[^']+')" '{gsub("'\''", "", $3); for (n=1; n<=3; n++)if($n)printf $n " "; else printf "Not available "; print "" }' fichier
Identifiant Prenom_Nom Date_et_Heure_Jour
0151 Not available 01/04/16 15:43:58
Hors ligne
#17 Le 08/04/2016, à 15:50
- jockasse
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Ha bah oui ! Comme ça c'est parfait !
Merci beaucoup credenhill !
Un grand merci à vous, maintenant je sais que j'ai le choix entre gawk et sed !
Hors ligne
#18 Le 09/04/2016, à 09:05
- credenhill
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
J'en profite pour le remercier de l'utilisation (que je ne connaissais pas) de FPAT dans awk.
de rien, d'ailleurs la doc qui décrit la variable FPAT explique que c'est pour résoudre le problème posé par jockasse
http://www.gnu.org/software/gawk/manual … By-Content
Hors ligne
#19 Le 09/04/2016, à 10:08
- pingouinux
Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte
Certes, mais on n'a pas l'idée de chercher ce dont on ne soupçonne même pas l'existence…
Hors ligne