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

Shell et commandes GNU Discussion :

Plusieurs lignes vers une seule au format CSV


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut Plusieurs lignes vers une seule au format CSV
    Bonjour,

    Je suis toujours débutant en script shell.

    J'ai les données suivantes comme input :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    83644701
    CR
    032
    026955764
    LI3-28872
    Et je veux avoir le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    83644701;CR;032;026955764;LI3-28872
    Mon effort :

    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    83644701;
    CR;
    032;
    026955764;
    LI3-28872;
    C'est pas comme je veux !!!

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 382
    Points
    19 382
    Par défaut
    Bonjour,

    « en input » c'est un fichier, ou les paramètres d'un script ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    En gnu sed (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n ':A;$s/\n/;/gp;N;bA'
    PS:La prochaine fois, crée un nouveau sujet car là tu es hors sujet...
    Cordialement.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    « en input » c'est un fichier, ou les paramètres d'un script ?
    Oui c'est un fichier

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 382
    Points
    19 382
    Par défaut
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ read -a ar < <(echo $(<fichier.input ))
    $ var=$(IFS=';'; echo "${ar[*]}")
    $ echo "$var"
    83644701;CR;032;026955764;LI3-28872
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ read -a ar < <(echo $(<fichier.input ))
    $ var=$(IFS=';'; echo "${ar[*]}")
    $ echo "$var"
    83644701;CR;032;026955764;LI3-28872
    Hmmm, dans le cas suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    83644701
    CR TOTO
    032
    026955764
    LI3-28872
    J'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    83644701;CR;TOTO;032;026955764;LI3-28872
    Sinon, en bash, plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ar="`<fichier.input`"
    $ var="${ar//
    /;}"
    $ echo $var
    83644701;CR TOTO;032;026955764;LI3-28872
    Cordialement.

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 382
    Points
    19 382
    Par défaut
    attention, ar n'est alors plus un tableau, il est préférable de renommer la variable, pour éviter toute ambiguïté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ var="`<fichier.in`"
    $ var="${var//$'\n'/;}"
    $ echo "$var"
    83644701;CR TOTO;032;026955764;LI3-28872
    pour rester sur un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ unset ar; while read line; do ar+=( "$line" ); done < fichier.in 
    $ var=$(IFS=';'; echo "${ar[*]}")
    $ echo "$var"
    83644701;CR TOTO;032;026955764;LI3-28872
    c'est un peu plus lourd. :/
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    avec awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk '{s=s";"$0} END {print substr(s,2)}' fichier
    83644701;CR TOTO;032;026955764;LI3-28872

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    attention, ar n'est alors plus un tableau, il est préférable de renommer la variable, pour éviter toute ambiguïté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ var="`<fichier.in`"
    $ var="${var//$'\n'/;}"
    $ echo "$var"
    83644701;CR TOTO;032;026955764;LI3-28872
    Cool, j'avais oublié cette syntaxe du $'\n'
    Citation Envoyé par N_BaH Voir le message
    pour rester sur un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ unset ar; while read line; do ar+=( "$line" ); done < fichier.in 
    $ var=$(IFS=';'; echo "${ar[*]}")
    $ echo "$var"
    83644701;CR TOTO;032;026955764;LI3-28872
    c'est un peu plus lourd. :/
    On peut aussi la faire simple via un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ mapfile -t ar <fichier.in
    $ var=$(IFS=';'; echo "${ar[*]}")
    $ echo "$var"
    83644701;CR TOTO;032;026955764;LI3-28872
    Cordialement.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Alors je vous remercie tous l'équipe.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Re,

    Je suis vraiment désolé encore, si j'ai ça comme fichier input

    83644701
    CR
    032
    026955764
    LI3-28872
    86443401
    MS
    012
    021483165
    LI3-18643
    86444441
    MS
    081
    023798253
    ECH138020000224

    et j'aimerai avoir le résultat suivant :

    83644701;CR;032;026955764;LI3-28872

    86443401;MS;012;021483165;LI3-18643

    86444441;MS;081;023798253;ECH138020000224

    c'est à dire, chaque bloc de 5 lignes je vais le transformer en une seule ligne.

  12. #12
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xargs -n5 -d'\n' <fichier de base  > fichierresultat

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par frp31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xargs -n5 -d'\n' <fichier de base  > fichierresultat
    Je trouve cette Erreur : xargs: L'option -d est incorrecte.

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    en awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '( FNR%5>=1 && ORS=";" ) || ORS="\n"' fichier
    Cordialement.

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    en awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '( FNR%5>=1 && ORS=";" ) || ORS="\n"' fichier
    Merci beaucoup. ça marche bien

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Pour ceux que ça intéresse, la version sed modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  ':A;5~5s/\n/;/g;t;N;bA'
    Cordialement.

  17. #17
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '( FNR%5>=1 && ORS=";" ) || ORS="\n"' fichier
    elle est belle celle-là

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pour ceux que ça intéresse, la version sed modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  ':A;5~5s/\n/;/g;t;N;bA'

    Merci.

  19. #19
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par hichem0550 Voir le message
    Je trouve cette Erreur : xargs: L'option -d est incorrecte.
    c est pourtant posix comme methode mais l option peut etre pas

  20. #20
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    elle est belle celle-là
    Mouais, sauf que j'aurai pu la simplifier : FNR%5>=1 c'est juste vérifier que l'on est différent de 0, donc le >=1 est inutile puisque pour awk, 0 est considéré comme faux...
    Cordialement.

Discussions similaires

  1. copier des plages variables de plusieurs feuilles vers une seule
    Par irene15 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 22/06/2007, 13h44
  2. Plusieurs lignes dans une seule
    Par rlnd23 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2007, 16h35
  3. [MySQL] Remplir plusieurs lignes d'une seule table avec le même formulaire
    Par zehni dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/09/2006, 12h12
  4. Réponses: 4
    Dernier message: 14/09/2005, 16h29
  5. Concatenation de plusieurs lignes en une seule
    Par stawen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 13h55

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