Aller au contenu

[Resolu]Sed


Charles.w

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

Une autre alternative, même si la solution de tuXXX est intéressante, ça sert toujours de voir différents styles. :ouioui:

for LINE in $(cat $FILE); do (echo $LINE; cat $(echo $LINE | cut -d; -f1) | tr '\n' ' ');done > $NEWFILE

Posté(e)

pour un peu d'élégance et de raffinement, je rappelle l'existence de la commande paste dans les coreutils :ouioui:

et peut-être plus fort encore avec la commande join qui fait une jointure sur un champ commun (ici nom_fichier*)

bref à cogiter :)

Posté(e)

Hello sandman :ouioui:

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 ;)

Posté(e)
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 ? :cartonrouge:

Posté(e)

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)

Posté(e)
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 :eeek2:

Et puis "for i in truc*" est préférable à "for i in `ls truc *`" :ouioui:

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...

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...