Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#51 Le 22/02/2011, à 12:32

Hizoka

Re : Manipulation de fichier texte [Résolu]

"${ligne% *}"

Cela veut dire : efface tout j'au 1er espace que tu trouve en partant de la fin

ligne="oui non peut-etre"
echo "${ligne% *}"
=> oui non
ligne=$(wc -l <<< "${a}")

ca bug car c'est pas ${a} dans ton cas mais ${a[@]} car cela concerne une liste

Là où je bute c'est sur <<< , pourquoi 3< ?

essaie avec moins, tu verras...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#52 Le 22/02/2011, à 13:02

ridfa

Re : Manipulation de fichier texte [Résolu]

Quand je supprime un des caractères "<", le code qui est écrit avec gedit (et donc comprend la coloration syntaxique) ne colore plus le code dès la ligne suivante (problème déjà)
Ensuite dans la dernière fenêtre (l'aperçu), le comptage des lignes ne se fait plus
"0 lignes ont été modifiées"
et le terminal me renvoie ces 2 lignes d'erreurs:

line 18: warning: here-document at line 18 delimited by end-of-file (wanted `${a}')
line 17: warning: here-document at line 17 delimited by end-of-file (wanted `${a}')

Sachant que les lignes 17 et 18 sont les suivantes :

ligne=$(wc -l << "${a}")
echo "${ligne% *} lignes ont été modifiées" > "${ffichier}.txt"

Pour précision et c'est vrai que mon discours peut induire en erreur (désolé sad )
Quand je parle de bug, je pense à mon cerveau lol

Parce-que malgré votre bonne volonté et vos explications (qui sont très claires, aucun doute), je ne comprend pas (rapidement) ce que je dois déduire quand je supprime un des caractères "<" (dans ce cas, par exemple) hmm
mais ça va venir, je continue de chercher...
big_smile

Dernière modification par ridfa (Le 22/02/2011, à 13:04)

Hors ligne

#53 Le 22/02/2011, à 13:06

Hizoka

Re : Manipulation de fichier texte [Résolu]

a="oui
non
peut-etre"
wc -l <<< "$a"
=> 3
wc -l << "$a"
=> Attend autre chose...
wc -l < "$a"
=> bash: oui
=> non
=> peut-etre: Aucun fichier ou dossier de ce type

donc la réponse était : si j'enleve un < , ca ne marche plus


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#54 Le 22/02/2011, à 13:43

ridfa

Re : Manipulation de fichier texte [Résolu]

Bon ben OK
Si je veux afficher le comptage des lignes depuis une variable, il faut 3<

wc -l <<< "$a"

Et ça :

wc -l < "$a"
wc -l << "$a"

ce sont des erreurs de syntaxe (!?)

Sinon sans que tu ne me donnes la réponse (ou pas tout de suite alors), juste pour t'expliquer où je veux en venir.
Sur la base de ce qui m'a été dit plus haut, je voudrais demander au script de compter les lignes du fichier sélectionné (donc $fichier)
Pour qu'à la fin il me dise :

"Tant de lignes dans le fichier de départ
Tant de lignes ont été modifées"

Dans ce but, j'ai modifié comme ça

lignefichier=$(wc -l <<< "${fichier}")
ligne=$(wc -l <<< "${a}")
echo "${lignefichier% *}" > "${ffichier}.txt"
echo "${ligne% *} lignes ont été modifiées" >> "${ffichier}.txt"
echo "${a}" >> "${ffichier}.txt"
zenity --text-info \
--title "Résultat" \
--width "412" \
--filename "${ffichier}.txt"

mais il ne compte pas les lignes du fichier d'entrée, il affiche 1

Puis qu'il supprime les deux premières lignes dans le fichier final (je n'ose même pas écrire ce à quoi j'ai pensé, mais avec un peu plus de temps...)

En tous cas, c'est cool M. Hizoka, merci

Hors ligne

#55 Le 22/02/2011, à 13:51

Hizoka

Re : Manipulation de fichier texte [Résolu]

ce sont des erreurs de syntaxe (!?)

si tu veux... il faut retenir que ce n'est pas fonctionnel..

lignefichier=$(wc -l <<< "${fichier}")

un peu de logique smile
fichier => c'est ton adresse de fichier... donc une ligne...
pour le coup c'est :

lignefichier=$(wc -l "${fichier}")

=> remplace la variable toi meme :

lignefichier=$(wc -l "l'adresse du fichier")
ligne=$(wc -l <<< "${a}")

=> c'est surement ${a[@]} que tu veux (si c'est toujours une liste)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#56 Le 22/02/2011, à 14:34

ridfa

Re : Manipulation de fichier texte [Résolu]

cool J'ai compris...

lignefichier=$(wc -l "${fichier}")
ligne=$(wc -l <<< "${a[@]}")
echo "le fichier comporte ${lignefichier%% *} lignes" > "${ffichier}.txt"
echo "${ligne% *} lignes ont été modifiées" >> "${ffichier}.txt"
echo "${a}" >> "${ffichier}.txt"

Du coup il m'affiche bien le nombre de lignes du fichier en entrée sans le chemin du fichier
Puis le nombre de lignes dans le fichier final
big_smile
Et j'ai même trouvé comment lui dire de supprimer les 2 premières lignes dans le fichier final

sed -i '1,2d' "${ffichier}.txt"

Comme quoi, la perseverance, une bonne assistance et le tour est joué tongue (un peu de flatterie perso!)
Au final, voilà le script

#!/bin/bash
fichier=$(zenity --file-selection\
    --title "Fichier à traiter"\
    --filename "dossier_par_defaut_pour_choisir_fichier") || exit
ffichier=$(zenity --file-selection \
    --title "Nom du fichier final" \
    --filename "dossier_par_defaut_pour_enregistrer_fichier_final" \
    --save) || exit
a=
while read
do
    [[ $REPLY == *http://192.168.1.1* ]]\
       && [[ $a != *${REPLY#*http://192.168.1.1}* ]]\
       && a+="${REPLY/*http/http}"$'\n'
done <"$fichier"
printf "$a" > "${ffichier}.txt"
lignefichier=$(wc -l "${fichier}")
ligne=$(wc -l <<< "${a[@]}")
echo "le fichier comporte ${lignefichier%% *} lignes" > "${ffichier}.txt"
echo "${ligne% *} lignes ont été modifiées" >> "${ffichier}.txt"
echo "${a}" >> "${ffichier}.txt"
zenity --text-info \
--title "Résultat" \
--width "412" \
--filename "${ffichier}.txt"
sed -i '1,2d' "${ffichier}.txt"
exit 0

Vraiment très content Rosco! lol

edit : Je viens de remarquer que le script crée une liigne vide en fin du fichier final et cela fausse le comptage, c'est du chippotage mais dans une optique d'apprentissage ça m'intéresse.
Y a t-il une erreur ou dois-je lui demander de supprimer les lignes vides du fichier final?

Dernière modification par ridfa (Le 22/02/2011, à 14:41)

Hors ligne

#57 Le 22/02/2011, à 15:53

Levi59

Re : Manipulation de fichier texte [Résolu]

Dans l'optique de comprendre le fonctionnement du shell, c'est intéressant d'évoquer cette manière de faire avec "wc" mais je trouve cela beaucoup moins pratique de passer par d'autres programmes pour faire ça alors que l'on peut s'en passer...
Surtout que comme tu le fais remarquer, tu crées de nouveaux problèmes en cherchant la difficulté.

Bien sûr ce n'est que mon avis. wink

Hors ligne

#58 Le 22/02/2011, à 17:39

ridfa

Re : Manipulation de fichier texte [Résolu]

Salut Levi smile

Ce serait wc qui crée une ligne vide supplémentaire?
Que veux-tu dire par passr par d'autres programmes, tu penses à sed ?
Sinon c'est juste pour comprendre car la ligne vide en soit ne gene pas le traitement suivant du fichier, le système plante s'il trouve une ligne "mal formatée".

Hors ligne

#59 Le 22/02/2011, à 18:26

Totor

Re : Manipulation de fichier texte [Résolu]

Levi59 a écrit :

Je suis gentil je te file mon mémo...

il n'est pas complet ton mémo tongue
regarde mon intervention #21


-- Lucid Lynx --

Hors ligne

#60 Le 22/02/2011, à 19:26

Levi59

Re : Manipulation de fichier texte [Résolu]

Je viens de regarder...
Tu parles bien de cette écriture? : ${!array[@]}

Je ne suis pas sûr de son fonctionnement. voilà ce que j'obtiens en testant :

rombeaut@DebianDesktop:~$ a=( a b c d e f g h )

# ça donne juste la liste des numéros de lignes dans la liste? 
rombeaut@DebianDesktop:~$ echo "${!a[@]}";echo "${a[@]}"
0 1 2 3 4 5 6 7
a b c d e f g h
rombeaut@DebianDesktop:~$ a=( a b c "" "" f g h )
rombeaut@DebianDesktop:~$ echo "${!a[@]}";echo "${a[@]}"
0 1 2 3 4 5 6 7
a b c   f g h

# J'ai repris la ligne de ton post précédent:
rombeaut@DebianDesktop:~$ printf "http://%s\n" "${!a[@]}"
http://0
http://1
http://2
http://3
http://4
http://5
http://6
http://7

Hors ligne

#61 Le 22/02/2011, à 23:57

Hizoka

Re : Manipulation de fichier texte [Résolu]

a=1
b=2
c=3
for x in a b c
do
echo ${!x}
done

tres pratique cette petite chose.

Y a t-il une erreur ou dois-je lui demander de supprimer les lignes vides du fichier final?
=> tres certainement ta variable "$a" qui contient un espace.
avec sed, tu peux supprimer les lignes vides : sed -i '/^$/d' fichier
ou supprimer la derniere ligne sed -i '$d' fichier

Levi59 =>

time for ((x=1;x<=20;x++))
do
wc -l /etc/passwd
done

real    0m0.019s
user    0m0.010s
sys     0m0.000s
time for ((x=1;x<=20;x++))
do
a=0
while read ligne
do
((a++))
done < <(cat /etc/passwd)
echo $a
done

real    0m0.061s
user    0m0.020s
sys     0m0.010s

pourquoi ne pas utiliser les outils existants ?


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#62 Le 23/02/2011, à 01:32

Levi59

Re : Manipulation de fichier texte [Résolu]

Attention! Tu tests la rapidité de la boucle while avec comptage et tu opposes ça à wc...

Évidemment que wc est plus rapide comme ça mais si tu reviens sur le script tu remarqueras que ma solution s'intègre à une boucle existante alors que tu rajoutes la commande wc au script en plus de la boucle et je ne parle pas de l'exécution de sed!
Dans ces conditions, les temps sont différents.

Si l'on regarde l'impact de l'incrémentation seule :

time for ((x=1;x<=20;x++))
do a=0
while read ligne
do echo ok
((a++))
done < <(cat /etc/passwd)
echo $a
done
real    0m0.192s
user    0m0.156s
sys    0m0.060s
time for ((x=1;x<=20;x++))
do a=0
while read ligne
do echo ok
done < <(cat /etc/passwd)
echo $a
done
real    0m0.172s
user    0m0.152s
sys    0m0.060s

Soit une augmentation de :

real    0m0.020s
user    0m0.004s
sys    0m0.000s

Si je place un wc dans le test précédent, le résultat est bien moins optimisé :

time for ((x=1;x<=20;x++))
do a=0
while read ligne
do echo ok
done < <(cat /etc/passwd)
a=$(wc -l /etc/passwd)
echo $a
done
real    0m0.275s
user    0m0.184s
sys    0m0.124s

Soit une augmentation de la durée pour wc par rapport à l'incrémentation de :

real    0m0.083s
user    0m0.028s
sys    0m0.064s

Moi aussi je sais faire parler les chiffres! ^^

Maintenant, c'est facile de prendre des bouts de codes qui nous convienne, j'en conviens mais je pense avoir réduit au maximum le risque d'erreur avec ces exemple (même si j'ai ignoré sed qui de toute manière aurait encore rallongé le temps de fonctionnement)

Dernière modification par Levi59 (Le 23/02/2011, à 01:37)

Hors ligne

#63 Le 23/02/2011, à 01:50

Hizoka

Re : Manipulation de fichier texte [Résolu]

hé hé smile

soit, au temps profiter de la boucle wink


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#64 Le 23/02/2011, à 08:50

Totor

Re : Manipulation de fichier texte [Résolu]

alors celle là, on ne me l'avait encore jamais faite hmm

Hizoka a écrit :

while read ligne
do
a=0
((a++))
done < <(cat /etc/passwd)

Tu mériterais bien un award pour ça !!! tongue

a=0
while read
do
((a++))
done <  /etc/passwd

-- Lucid Lynx --

Hors ligne

#65 Le 23/02/2011, à 10:15

Hizoka

Re : Manipulation de fichier texte [Résolu]

pourquoi faire simple quand on peut faire compliqué ? tongue


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#66 Le 23/02/2011, à 11:28

Levi59

Re : Manipulation de fichier texte [Résolu]

Totor a écrit :

alors celle là, on ne me l'avait encore jamais faite hmm

Hizoka a écrit :

done < <(cat /etc/passwd)

Tu mériterais bien un award pour ça !!! tongue

done <  /etc/passwd

Tiens! C'est vrai, je ne l'avais même pas vu celui-là... ^^

EDIT

Tu ne m'as pas répondu pour le motif manquant... J'aimerais mieux comprendre son intérêt surtout dans ta commande précédente.

Dernière modification par Levi59 (Le 23/02/2011, à 11:34)

Hors ligne

#67 Le 23/02/2011, à 12:14

Totor

Re : Manipulation de fichier texte [Résolu]

Levi59 a écrit :

Tu ne m'as pas répondu pour le motif manquant... J'aimerais mieux comprendre son intérêt surtout dans ta commande précédente.

Dans sa forme la plus basique, elle permet d'accéder à la valeur (Val) de la variable (Var1) dont le nom est la valeur de la valeur Var0.

c.a.d :

$ Var1=Val
$ Var0=Var1
$ echo ${!Var0}
Val

Dans le cas présent, il n'y a pas vraiment d'intérêt. Mais l'on peut facilement imaginer un fichier contenant 100 variables que l'on souhaite exploiter ...

fichier a écrit :

var0=val1
var1=val1
...
var99=val99

le plus simple :

# on "source" le fichier
. fichier
# on traite les 100 variables
for((i=0;i<=99;i++))
do
  printf "traitement de la %sème valeur..." $((i+1))
  variable="var${i}"
  valeur=${!variable}
  # traitement...
done

Dans mon cas, il s'agit d'un tableau associatif : les indices du tableau ne sont pas des entiers mais des chaines de caractères. Cette notation permet effectivement d'accéder aux "indices" du tableau.
Pourquoi utiliser un tel tableau et non pas un simple tableau où les url seraient des valeurs et non pas les indices ? Tout simplement pour éviter l'éventuelle gestion de doublons !


-- Lucid Lynx --

Hors ligne

#68 Le 23/02/2011, à 18:45

Levi59

Re : Manipulation de fichier texte [Résolu]

Ok! Merci de ton explication, je complète de suite mon mémo. ^^

Hors ligne

#69 Le 23/02/2011, à 19:34

Hizoka

Re : Manipulation de fichier texte [Résolu]

Tu ne m'as pas répondu pour le motif manquant... J'aimerais mieux comprendre son intérêt surtout dans ta commande précédente.
=> http://forum.ubuntu-fr.org/viewtopic.ph … 7#p4011097
la 1ere balise code


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#70 Le 23/02/2011, à 23:57

ridfa

Re : Manipulation de fichier texte [Résolu]

Hizoka a écrit :

Y a t-il une erreur ou dois-je lui demander de supprimer les lignes vides du fichier final?
=> tres certainement ta variable "$a" qui contient un espace.

J'ai bien pris mon temps pour voir comment la variable "$a" pouvait contenir un espace mais malgré différents essais la ligne supplémentaire apparaît toujours en fin de fichier.
Pour sed j'y avais pensé mais je voudrais éviter de corriger une erreur de construction de code par une commande supplémentaire dans le script dans le but d'apprendre à construire du "code propre".
Bref, je me dis que cela doit donc venir de cette partie du script

do
    [[ $REPLY == *http://192.168.1.1* ]]\
       && [[ $a != *${REPLY#*http://192.168.1.1}* ]]\
       && a+="${REPLY/*http/http}"$'\n'
done <"$fichier"

Là ou je ne m'y retrouve plus c'est que ce bout de code, je n'y ai pas touché depuis que je cherche "à compter les lignes" disons hmm

Voilà,voilà...

Hors ligne

#71 Le 24/02/2011, à 01:53

Levi59

Re : Manipulation de fichier texte [Résolu]

La seule vrai raison, c'est qu'à vouloir mettre trop de rouages, tu as fini par enrayer le système... Allège ton code et tu réduiras le risque d'erreurs.

Hors ligne

#72 Le 24/02/2011, à 09:48

Hizoka

Re : Manipulation de fichier texte [Résolu]

poste ton code actuel, qu'on voit ce que l'on peut ameliorer...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#73 Le 24/02/2011, à 17:44

ridfa

Re : Manipulation de fichier texte [Résolu]

Bonjour Messieurs smile

Tout d'abord le code actuel

#!/bin/bash
fichier=$(zenity --file-selection\
    --title "Fichier à traiter"\
    --filename "dossier_par_defaut_pour_choisir_fichier") || exit
ffichier=$(zenity --file-selection \
    --title "Nom du fichier final" \
    --filename "dossier_par_defaut_pour_enregistrer_fichier_final" \
    --save) || exit
a=
while read
do
    [[ $REPLY == *http://192.168.1.1* ]]\
       && [[ $a != *${REPLY#*http://192.168.1.1}* ]]\
       && a+="${REPLY/*http/http}"$'\n'
done <"$fichier"
printf "$a" > "${ffichier}.txt"
lignefichier=$(wc -l "${fichier}")
ligne=$(wc -l <<< "${a[@]}")
echo "le fichier comporte ${lignefichier%% *} lignes" > "${ffichier}.txt"
echo "${ligne% *} lignes ont été modifiées" >> "${ffichier}.txt"
echo "${a}" >> "${ffichier}.txt"
zenity --text-info \
--title "Résultat" \
--width "412" \
--filename "${ffichier}.txt"
sed -i '1,2d' "${ffichier}.txt"
exit 0

Qui ne fait pas apparaître le comptage de ligne dans la barre de titre (Bien que je trouve ça très futé, comme l'a fait remarquer Hizoka)
ni même la suppression de ligne par sed. A ce sujet j'ai tenté de coller une ligne qui compterai le nombre de lignes vides en collant ces 2 lignes

lignevide=$(egrep "^$" "${ffichier}" | wc -l)
echo "${lignevide% *}" >> "${ffichier}.txt"

A la fin du script, juste avant le code suivant

zenity --text-info \
--title "Résultat" \
--width "412" \
--filename "${ffichier}.txt"
sed -i '1,2d' "${ffichier}.txt"
exit 0

Mais j'ai du merder car il me sort un zéro (??)

Ensuite, oui c'est que je cherche un code "light" au max mais la possibilité d'en tirer un apprentissage qui me servira et donc ne pas me brider dans le fonctionnalités. Même si (j'espère) ne pas avoir d'envie trop farfelue ou trop loin de ce que je peux réaliser/appliquer tout en saisissant au max ce qui est fait par le script ou les commandes.

Merci de votre intérêt et de m'aider, je ne le dirai jamais assez au vu de votre patience

Hors ligne

#74 Le 24/02/2011, à 17:53

FRUiT

Re : Manipulation de fichier texte [Résolu]

nblignes=$(egrep -v "^$" "${ffichier}" | wc -l)

Dernière modification par FRUiT (Le 24/02/2011, à 18:14)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#75 Le 24/02/2011, à 18:09

ridfa

Re : Manipulation de fichier texte [Résolu]

FRUiT a écrit :
nblignes=$(egrep -v "^$" "${ffichier}" | wc -l)

Ben ça donne toujours zéro pourtant la ligne vide y est hmm

edit : j'ai regardé ton lien, sont pas mal tes thèmes cool, ça serait possible sous gnome?

Dernière modification par ridfa (Le 24/02/2011, à 18:12)

Hors ligne