Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Simple question de traitement de texte
Envoyé par: tony13


Bonjour à tous,

je suis face à un problème qui doit être simple à résoudre mais je ne sais quel outil est le plus adapté à ma question.

Je dispose d'un fichier en colonne séparée par des tabulations et j'aimerais savoir quel outil est le plus disposé à traiter ces colonnes en lignes de commandes. il y a bien "cut" mais qui ne permet seulement que d'extraire des colonnes spécifiques.

Dans mon exemple, en admettant que je dispose de disons 10 colonnes, j'aimerais fusionner les trois premiere colonne avec "_" comme séparateur et donc me retrouver ensuite avec un fichier à 8 colonnes, la première colonne résultant de la concatenation des 3 premières colonnes initiales.

Quelqu'un a-t-il une réponse à ça ?

Merci d'avance,

Tony

Poste le Thursday 28 June 2007 10:44:56
Répondre     Citer    
Re: Simple question de traitement de texte
Envoyé par: Fanch

le mieux est d'utiliser sed ou awk, mais il va falloir apprendre à écrire des expressions régulières (regex pour les intimes).

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Thursday 28 June 2007 11:16:05
Répondre     Citer    
Re: Simple question de traitement de texte
Envoyé par: oudoubah

Citation
Fanch
le mieux est d'utiliser sed ou awk, mais il va
falloir apprendre à écrire des expressions
régulières (regex pour les intimes).

Puisque tu proposes les 2, on va devoir faire avec ;-)

Donc, en sed :
sed "s/^\([^\t]*\)\t\([^\t]*\)\t/\1_\2/" < fichier

En awk :
awk FS="\t" '{printf("%s_%s_%s\t%s\t%s\t%s\t%s\t%s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10)}'

Je n'ai rien testé.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 28 June 2007 12:42:55
Répondre     Citer    
Re: Simple question de traitement de texte
Envoyé par: Sve@r

Salut
Suis actuellement en cours de shell. J'ai donc montré ton intéressant problème à la classe qui a été tout de suite hyper motivée pour s'y atteler avec une ferveur émouvante. Tu aurais dû les voir pianoter avec fureur pour celui qui arriverait le plus vite au but attendu.

Voici la solution qui a été retenue
#!/bin/sh

# Création d'un canal de lecture
exec 3<tonyFic

# Lecture du canal
while read ligne 0<&3
do
    # Découpage des 3 premières colonnes
    col1=`echo "$ligne" |cut -f1 -d"    "`
    col2=`echo "$ligne" |cut -f2 -d"    "`
    col3=`echo "$ligne" |cut -f3 -d"    "`

    # Récupération du reste de la ligne
    reste=`echo "$ligne" |cut -f4- -d"  "`

    # Affichage des infos
    echo "${col1}_${col2}_${col3}   $reste"
done

Bien entendu, ce résultat shell pur n'est qu'un exercice de style et ne rivalisera jamais avec la solution awk d'Oudoubah...

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Thursday 28 June 2007 13:58:56
Répondre     Citer    
Re: Simple question de traitement de texte
Envoyé par: oudoubah

Tu n'as pas encore appris "tr" à tes étudiants? ;-)

col13=$(echo "$ligne" |cut -f1-3 -d" " | tr "\t" "_")

Je travaille actuellement avec ton cours de shell sous les yeux et les expressions pure bash ${var%texte}. Il n'y aurait pas une solution sur cette base? (sous-titré, est-ce que \t sera bien interprété par le bash comme une tabulation?)

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 28 June 2007 14:14:38
Répondre     Citer    
Re: Simple question de traitement de texte
Envoyé par: Sve@r

Citation
oudoubah
Tu n'as pas encore appris "tr" à tes étudiants?
Je leur ai montré "sed" et "awk" (ils ont d'ailleurs parfaitement compris ton pgm awk et l'on trouvé mieux que celui qu'ils ont écrit) mais j'ai laissé "tr" de coté car il est relativement simple à appréhender et ils peuvent le faire tout seul (il se trouve dans mon cours).

Citation
oudoubah
Je travaille actuellement avec ton cours de shell sous les yeux
T'as du bol, la v2 ne date que de lundi...

Citation
oudoubah
et les expressions pure bash
${var%texte}. Il n'y aurait pas une solution sur
cette base? (sous-titré, est-ce que \t sera bien
interprété par le bash comme une tabulation?)

Faut bien savoir qui va interpréter le "\t". Si c'est un "echo", alors avec "echo -e" ce sera bon. Si c'est "sed" ou "tr" je pense que oui. Mais le shell en lui-même ne comprend pas la signification du caractère "\t".
Exemple
#!/bin/sh
var="a\tb"

case $var in
    "a\tb") echo ok;;
    "a  b") echo ok2;;
esac

J'ai bien "ok" mais pas "ok2"

Maintenant, j'ai beau me creuser la tête, je ne vois pas comment utiliser efficacement "${var%x}" pour résoudre le problème initial...

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Thursday 28 June 2007 15:55:29
Répondre     Citer    
Re: Simple question de traitement de texte
Envoyé par: tony13


Merci beaucoup à tous les 2 !
je n'ai que l'embarras du choix maintenant.

sve@r, si tu veux des exos pour tes eleves, j'ai pas mal de problemes! winking smiley

tony

Poste le Thursday 5 July 2007 15:29:10
Répondre     Citer    
Re: Simple question de traitement de texte
Envoyé par: Sve@r

Citation
tony13
sve@r, si tu veux des exos pour tes eleves, j'ai
pas mal de problemes! winking smiley
Envoie tes problèmes, on t'enverra les solutions :chef:



L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Sunday 8 July 2007 18:57:31
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Simple question de traitement de texte
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons