Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/12/2007, 16h23   #1
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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 :
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 :
1
2
3
4
5
 
cd $MyFolder
c_list=`ls *.txt`
 
cat $c_list 1> $MyFinalFile 2>&1
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 16h45   #2
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 5 499
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 5 499
Points : 9 679
Points : 9 679
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 :
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 !
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 16h57   #3
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
effet de bord de grep...
Code :
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 17h29   #4
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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 :
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
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 18h10   #5
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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?
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 18h18   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 11h10   #7
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
excuse moi j'ai pas vu ton code avant de poster..

finalement c super efficace effectivement.. il fallait faire :

Code :
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
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 11h34   #8
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
Citation:
Envoyé par freestyler Voir le message
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..
grep effectue un retour chariot après chacune des lignes qu'il a affichées.
grep -e'$' affiche toutes les lignes, (grep -e'^' aussi d'ailleurs)
Pour n'afficher que les lignes non vides, grep -ve'^$' devrait fonctionner.
__________________
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h35.


 
 
 
 
Partenaires

Hébergement Web