PDA

Afficher la version complète : [Réglé] lire un fichier mot par mot séparé par une virgule



berny
12/10/2011, 19h51
Bonjour,

J'essaie de lire un fichier en bash ligne par ligne. J'utilise donc:

cat exemple.txt | while read mot1 mot2 mot3
do

echo "$mot1 $mot2 $mot3"

done

Ca fonctionne assez bien... L'élément qui sépare les mots est un espace.

Je souhaiterais maintenant faire la même chose mais en utilisant la virgule (ou tout autre élément comme ;, ",...). En effet, mon "mot1" est en fait composé de 2 mots ;-) .Comment y arriver?

Merci de votre aide

Burn2
12/10/2011, 20h17
Bonjour, une solution simple, en admettant bien sûr que tes mots ne comprennent pas le caractère en question.

Etape 1, on récupère le nombre d'occurrence de ce caractère délimitant les mots. (ici j'ai pris ";" et comme nom de fichier test.txt)

grep -o ";" test.txt|wc -l
Tu stockes ça et tu sais que tu as donc n+1 mot (n étant le nombre de caractères comptés)

Etape 2, pour récupérer chaque mot tu peux donc parcourir via la commande suivante:


cat test.txt|cut -d";" -f5

En remplaçant le 5 par un entier que tu fais varier de 0 à n+1. cut te permettant de récupérer une colonne particulière d'un tableau qu'il a découpé à partir du délimiteur donné (-d donc ici j'ai bien mis aussi mon ; )


Cela te convient-il? :)

hartza
13/10/2011, 01h08
...en utilisant la virgule ...mon "mot1" est en fait composé de 2 mots ;-) .Comment y arriver?

Merci de votre aide

bonjour,

doit-on comprendre que mot1 contient un séparateur tel qu'un virgule?
si c'est le cas, on peut utiliser une fonction du gennre ${chaine//car1/car2} qui remplacera toutes les occurences de car1 par car2 dans le fichier permettant ensuite de tout récupérer.

exemple:

le fichier essai.txt contient le texte suivant:

tata Tete,titi toto tutu
tarata Terete,tiriti toroto turutu
taratata Teretete,tirititi torototo turututu le traitement suivant enlève les virgules. On peut ensuite lire mot à mot ou exploiter la puissance de cut.



> cat essai.txt |
> while read ligne
> do
> echo "ligne brute " $ligne
> echo "ligne traitée" ${ligne//,/' '}
> echo
> done

ligne brute tata Tete,titi toto tutu
ligne traitée tata Tete titi toto tutu

ligne brute tarata Terete,tiriti toroto turutu
ligne traitée tarata Terete tiriti toroto turutu

ligne brute taratata Teretete,tirititi torototo turututu
ligne traitée taratata Teretete tirititi torototo turututu

>
voilà, si ça peut aider

@+

velo_love
13/10/2011, 21h59
avec awk -F, ça ne serait pas plus facile ?
cat essai.txt | awk -F, '{print $1" "$2" "$3}'

hartza
14/10/2011, 00h21
avec awk ...'

Bonjour,

allez berny! un petit effort pour honorer Mr Kernighan qui vient de perdre un ami de 40 ans...


Bon courage

@+

berny
14/10/2011, 14h42
Je teste! Je vous tiens au courant!

Merci déjà pour vos nombreuses réponses

---------- Message ajouté à 14h42 ---------- Le dernier message était à 14h31 ----------

Ca fonctionne nickel! j'ai utilisé:

cat essai.txt | cut -d";" -f3

Merci beaucoup!

Burn2
14/10/2011, 20h16
De rien! :)

velo_love
14/10/2011, 20h35
Et en une seule commande, affichage de la 3ème colonne lesquelles sont séparées par un ";" :


awk -F\; '{print $3}' essai.txt

hartza
14/10/2011, 23h43
joli, Kernighan referens! bon weeh end