IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Changement de forme d'une chaîne de caractères


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 16
    Points
    16
    Par défaut Changement de forme d'une chaîne de caractères
    Bonjour à tous,

    Je demande encore à l'aide.
    J'ai un fichier (que l'on note "file1.csv") contenant des milliers de lignes (et même plusieurs fichiers identiques). Chacune est de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    22/04/2009 00:00:00,5 ,6
    22/04/2009 00:00:01,3 ,7
    22/04/2009 00:00:02,2 ,8
    et ainsi de suite.
    C'est en fait un fichier csv dont la première colonne représente le temps.
    Ce que je souhaite faire est de remplacer la date sous la forme "2009-04-22" (cad Année-Mois-Jour), et ainsi lire chaque ligne, récupérer les champs importants de la date courante pour ainsi les copier sous la nouvelle forme.
    Par souci de développement, je préfère ne pas utiliser de tableur, mais le faire en bash, par le biais peut-être de sed ou encore awk.

    Une idée pour cela?

    Merci d'avance.

    Et bonne soirée!

  2. #2
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Salut,

    Je te propose ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk -F'/' '{print $1 , $2 , $3}' file1.csv | awk '{print $3, "-", $2, "-", $1, $4, $5}' | sed 's/\ -\ /-/g'
    Rédacteur et Modérateur rubriques Linux et Virtualisation
    Mes Articles
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux
    N'oubliez pas de consulter les FAQ virtualisation et les cours et tutoriels Virtualisation
    Man pages en français

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lavazavio Voir le message
    Salut,

    Je te propose ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk -F'/' '{print $1 , $2 , $3}' file1.csv | awk '{print $3, "-", $2, "-", $1, $4, $5}' | sed 's/\ -\ /-/g'
    Euh... il me semble que si tu demandes à awk de parser sur le séparateur "/", le champ $3 contiendra l'ensemble "2009 00:00:00,5 ,6."

    Vaut mieux protéger le "2009 " avec un "/"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/\/2009 /\/2009\//" file1.csv | awk -F/ '{printf("%s-%s-%s %s\n", $3, $2, $1, $4)}'
    Si on veut être plus permissif sur la date, (gérer le cas 2008 et/ou 2010), on peut passer par des regexp dans le sed...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Euh... il me semble que si tu demandes à awk de parser sur le séparateur "/", le champ $3 contiendra l'ensemble "2009 00:00:00,5 ,6."
    Oui, c'est vrai. C'est pour ca que j'utilise un 2eme awk utilisant comme séparateur l'espace et non plus le slash.
    Testé et approuvé (par mes soins ).

    Le double awk n'est pas très élégant mais à l'avantage de gérer tous les cas.

    Cependant, ma solution est très bien aussi. Après, le choix se fait au goût de chacun.
    Rédacteur et Modérateur rubriques Linux et Virtualisation
    Mes Articles
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux
    N'oubliez pas de consulter les FAQ virtualisation et les cours et tutoriels Virtualisation
    Man pages en français

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/03/2014, 19h12
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. Réponses: 2
    Dernier message: 10/09/2007, 19h03
  4. Réponses: 1
    Dernier message: 01/11/2006, 19h20
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo