Charles.w Posté(e) le 17 février 2008 Partager Posté(e) le 17 février 2008 Je vous expose mon problème... J'ai un fichier dont le format est le suivant : nom_fichier1;132;323;434;43; nom_fichier2;13;33;34;433; Et j'ai un répertoire contenant des fichier textes comportant une ou deux lignes de texte pur, sans ponctuation mais avec des retours de chariot (généré par un executable Java via System.out.println())... pour nom_fichier1: SAINT ETIENNE pour nom_fichier2: MONTBRISON Je voudrais : - arranger les fichiers texte de sorte à ce que leur contenu tienne sur une seule ligne, et que les retours de chariot soit remplacés par un espace (le principal problème étant que je n'arrive pas à trouver comment virer les retours de chariot pour les remplacer par des espaces) - concaténer ces résultat ligne par ligne au fichier dont le format est décrit au début de ce post. Pour au final arriver à un truc du genre nom_fichier1;132;323;434;43;SAINT ETIENNE nom_fichier2;13;33;34;433;MONTBRISON Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 17 février 2008 Partager Posté(e) le 17 février 2008 En ayant le fichier de base qui s'appelle "fichier.txt" : $ while read LINE; do FILE="$(echo $LINE | awk -F';' '{print $1}')"; echo "$LINE$(cat $FILE | tr '\n' ' ')"; done < fichier.txt Les astuces c'est : * le "tr" qui transforme les retours à la ligne en espaces * le "while read" qui permet de lire ligne par ligne Lien vers le commentaire Partager sur d’autres sites More sharing options...
Charles.w Posté(e) le 17 février 2008 Auteur Partager Posté(e) le 17 février 2008 OK et merci, je teste ca demain matin Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 17 février 2008 Partager Posté(e) le 17 février 2008 Une autre alternative, même si la solution de tuXXX est intéressante, ça sert toujours de voir différents styles. for LINE in $(cat $FILE); do (echo $LINE; cat $(echo $LINE | cut -d; -f1) | tr '\n' ' ');done > $NEWFILE Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sandeman Posté(e) le 17 février 2008 Partager Posté(e) le 17 février 2008 pour un peu d'élégance et de raffinement, je rappelle l'existence de la commande paste dans les coreutils et peut-être plus fort encore avec la commande join qui fait une jointure sur un champ commun (ici nom_fichier*) bref à cogiter :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 17 février 2008 Partager Posté(e) le 17 février 2008 Hello sandman Effectivement, on peux remplacer le cat+tr dans l'exemple de tuXXX et dans le mien. Ce qui donne : while read LINE; do FILE="$(echo $LINE | awk -F';' '{print $1}')"; echo "$LINE$(paste -d' ' -s $FILE)"; done < fichier.txt for LINE in $(cat $FILE); do (echo $LINE;paste -d' ' -s $(echo $LINE | cut -d; -f1));done > $NEWFILE C'est effectivement un tout petit plus joli. Par contre je ne suis pas sûr qu'on puisse utiliser avantageusement join. Mais je serais ravi que tu me prouves le contraire Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 19 février 2008 Partager Posté(e) le 19 février 2008 et peut-être plus fort encore avec la commande join qui fait une jointure sur un champ commun (ici nom_fichier*)bref à cogiter :) Comme le demande Theo, pourrais-tu, entre deux biberons, nous montrer comment se servir de join dans ce genre de cas ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sandeman Posté(e) le 19 février 2008 Partager Posté(e) le 19 février 2008 bon bah juste pour le fun une jointure se faisant entre deux tables, il faut construire la seconde table , que j'appelle "content" for i in `ls nom_fichier*`; do echo "$i;`cat $i | tr '\n' ' '`"; done > content ensuite : join -t ";" fichier1 content résultat presque bon nom_fichier1;132;323;434;43;;SAINT ETIENNE nom_fichier2;13;33;34;433;;MONTBRISON bahoui je ne sais pas pourquoi cet abruti me rajoute un ";" /o\ comme c'est une jointure, tu peux utiliser le résultat du -v qui va te donner directement toutes les lignes non jointes (i.e. celles qui n'ont pas de correspondance) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Charles.w Posté(e) le 19 février 2008 Auteur Partager Posté(e) le 19 février 2008 Pour le dernier ";", je ne suis pas obligé de le rajouter Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 19 février 2008 Partager Posté(e) le 19 février 2008 for i in `ls nom_fichier*`; do echo "$i;`cat $i | tr '\n' ' '`"; done > content Bah Sandeman, tu nous parles de paste et tu ne l'utilses pas Et puis "for i in truc*" est préférable à "for i in `ls truc *`" bahoui je ne sais pas pourquoi cet abruti me rajoute un ";" /o\ Ton -t sette le caractère de jointure en entré mais aussi en sortie. Le man/info est très mal foutu, mais il semble qu'on ne puisse pas choisir un caractère différent pour l'entrée et la sortie.Une sale solution pourrait être : join -t ";" -o 1.1 2.2 2.3 2.4 2.5 1.2 content file Si on est sûr que le nombre de champs est fixe. Je n'ai pas mieux pour le moment. Un peu déçut par join, pour un outil GNU, on pouvait s'attendre à mieux... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.