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 :

concatenation de 2 fichiers+ajout de retour chariot si nécessaire


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut concatenation de 2 fichiers+ajout de retour chariot si nécessaire
    Bonjour,
    j'ai une liste de fichiers texte que je veux concaténer en un seul fichier texte.
    Le but est d'avoir des lignes successives dans le fichier final.
    Le problème avec la commande cat, est que s'il n'y a pas de retour chariot à la fin de chaque fichier, il fait une simple concaténation comme ceci :

    fichier1:
    Ma Première ligne de 1
    Ma Deuxième ligne de 1

    fichier2:
    Ma Première ligne de 2
    Ma Deuxième ligne de 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat fichier1 fichier2 > final
    -->

    final:
    Ma Première ligne de 1
    Ma Deuxième ligne de 1Ma Première ligne de 2
    Ma Deuxième ligne de 2

    Le problème est aue je ne garantis pas un format unique pour mes fichiers à concaténer.. comment dire: ajouter un retour chariot quand il n'y en a pas?? Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cd $MyFolder
    c_list=`ls *.txt`
     
    cat $c_list 1> $MyFinalFile 2>&1

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Une solution ne consisterait-elle pas à tester la présence de caractères alphanumériques sur la dernière ligne du fichier, et en fonction de ce que tu trouves, tu insères un non un retour chariot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #!/bin/ksh
     
    touch /tmp/fichier_res.txt
     
    for fichier in fichier1 fichier2 ... fichierN
    do
      res=`tail -1 $fichier | rgrep [A-z]`
     
      if [ res -eq 0 ] 
      then
        cat $fichier >> /tmp/fichier_res.txt
      else
        echo "" >> /tmp/fichier_res.txt
        cat $fichier >> /tmp/fichier_res.txt
      fi
    done
    Code à vérifier bien sur avant de le réutiliser comme ca !
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    effet de bord de grep...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -e'$' fichier1 | cat - fichier2
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    rgrep??

    Korn shell ne connait pas dsl..

    Je présume que c'est du grep avec expressions régulières mais je m'y connais pas trop..

    j'ai essayé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    cd $MyFolder
    c_list=`ls *.txt`
     
    for fichier in $c_list
    do
      res=`tail -1 $fichier | grep  "^[A-z]"`
     
      if [ $res -eq 0 ] 
      then
        cat $fichier >> $OUTPUT
      else
        echo "" >> $OUTPUT
        cat $fichier >> $OUTPUT
      fi
    done
    mais j'ai toujours une erreur de syntaxe

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    en plus, meme si il ya un retour chariot à la fin du fichier, tail retourne toujours la derniére ligne non vide..

    je croyais pas que c'était aussi compliqué, si?

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    Il ne te plaît pas mon code ?
    C'est pourtant efficace.
    retourne toutes les lignes du fichier en entrée, y compris la dernière à laquelle il ajoute un retour chariot s'il n'y en en a pas.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    excuse moi j'ai pas vu ton code avant de poster..

    finalement c super efficace effectivement.. il fallait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cd $MyFolder
    c_list=`ls *.txt`
     
    for fichier in $c_list
    do
    grep -e'$' $fichier >> $fichier_final
    done
    mais c'est auoi la logique derrière tout ca? que veut dire grep -e'$'?? ajouter une ligne vide quand il n'y en a pas??
    et que fait-on alors dans le cas contraire... c'est à dire si on veut enlever les lignes vides quand il y en a ?? sachant que pour une seule ligne vide le problème ne se pose pas..

    Merci

Discussions similaires

  1. [TextBlock] Ajouter un retour chariot dans le StringFormat
    Par bassreligion dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 08/11/2018, 15h14
  2. Réponses: 1
    Dernier message: 09/04/2009, 09h36
  3. Réponses: 2
    Dernier message: 11/11/2008, 12h45
  4. [VBA] Comment ajouter un retour chariot dans un label?
    Par fafaf dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/03/2007, 14h37
  5. Réponses: 2
    Dernier message: 11/07/2006, 15h00

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