Aller au contenu

[Resolu]Sed


Charles.w

Messages recommandés

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

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

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

Lien vers le commentaire
Partager sur d’autres sites

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

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

Lien vers le commentaire
Partager sur d’autres sites

Archivé

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

×
×
  • Créer...