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 07/04/2016, à 16: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, à 16:51)

Hors ligne

#2 Le 07/04/2016, à 17: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, à 17:03)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 07/04/2016, à 17: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, à 18: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, à 18: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, à 18:21)

Hors ligne

#6 Le 07/04/2016, à 18: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, à 20:20

jockasse

Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte

Merci yikes ! 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, à 21:31

Watael

Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte

"jockasse a écrit :

il va falloir que je bosse sérieusement le bash...

d'autant plus que sed n'est pas bash hmm


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 08/04/2016, à 09: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, à 12: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, à 12:10)

Hors ligne

#11 Le 08/04/2016, à 12: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, à 12:27)

Hors ligne

#12 Le 08/04/2016, à 13:22

jockasse

Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte

Super ! tongue

Je suis preneur de la solution, pour remplacer un champs vide par un 'Not Available'.

Merci

Hors ligne

#13 Le 08/04/2016, à 13: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, à 13:48)

Hors ligne

#14 Le 08/04/2016, à 14: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, à 14:48)

Hors ligne

#15 Le 08/04/2016, à 15: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, à 16: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, à 16:50

jockasse

Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte

Ha bah oui ! Comme ça c'est parfait big_smile !

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

credenhill

Re : [RESOLU] (Bash) Lire une ligne d'un fichier texte

pingouinux a écrit :

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, à 11: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… smile

Hors ligne