Fonction grep dans une if

Résolu/Fermé
PhillipeG - Modifié par jipicy le 10/04/2015 à 15:25
 PhillipeG - 13 avril 2015 à 10:42
Bonjour,
je débute en shell et je suis un peu perdu depuis quelques heures. Je possède un fichier text avec 1 colonne de nombre. Ces nombres apparaissent entre 0 et 2 fois et je voudrais effectuer une action en fonction du nombre de leur apparition. J'ai fait un programme avec la fonction grep -c mais cela ne fonctionne pas et je pense que c'est une erreur de structure de ma part mais je ne vois pas.
Voici le programme:

last_number=$(tail -1 test.txt)
for ((i=0 ; $last_number - $i ; i++))
do
if [ "grep -c ^$i$ test.txt" -eq 2];then echo "$i: twice" >> settings.txt 
elif [ "grep -c ^i$ test.txt" -eq 1]; then echo "$i: once" >> settings.txt
else echo "$i non présent" >> settings.txt
fi
done


je vous remercie d'avance.

2 réponses

Utilisateur anonyme
10 avril 2015 à 17:13
salut,

le deuxième argument de l'évaluation arithmétique de l'instruction
for
ne peut pas être un calcul.
quelle est la condition pour arrêter la boucle ?

dans les
if
,
grep
doit être dans une substitution de commande, et il faut respecter les espaces.

vous écrivez vos codes d'un trait sans tester pas à pas ?
avant de courir, ... !!!
0
j'ai déjà utilisé ce genre de structure dans une boucle for et ça ne m'a jamais posé de soucis.
La c'est vraiment le grep qui pose problème mais je n'arrive pas à corriger mon erreur.
0
j'ai compris qu'il me manquait un espace, tout fonctionne cependant je n'ai pas le résultat souhaité. si les chiffres n'apparaissent qu'une fois il ne va pas dans le "elif" mais dans le "else"
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 avril 2015 à 17:50
Salut,

On peut voir la tronche de ton fichier d'entrée (test.txt) s'il te plaît ?
tout fonctionne cependant je n'ai pas le résultat souhaité

Il y a tellement d'erreurs et d'incohérences que je ne pense pas que ça puisse fonctionner ;-\

0
Mon fichier d'entrée c'est une colonne avec des nombres croissants pas forcément continue et qui peuvent apparaître jusqu'à deux fois de suite, par exemple:
1
1
3
4
5
6
6
12
13
13
14

Après je débute je teste beaucoup de chose et j'ai pas toujours conscience de ce que j'écris dans le code :p
0
manuel > PhillipeG
13 avril 2015 à 10:24
$ cat foo.sh 

#! /bin/bash
#set -x

last_number=$(tail -1 plop)
for ((i=0 ; ${last_number} - ${i} ; i++))
do
if [ "$(grep -c ^${i}$ plop)" -eq 2 ];then echo "${i} : twice" >> settings.txt 
elif [ "$(grep -c ^${i}$ plop)" -eq 1 ]; then echo "${i} : once" >> settings.txt
else echo "${i} non présent" >> settings.txt
fi
done


$ ./foo.sh 


$ cat settings.txt 
0 non présent
1 : twice
2 non présent
3 : once
4 : once
5 : once
6 : twice
7 non présent
8 non présent
9 non présent
10 non présent
11 non présent
12 : once
13 : twice


PS. plop c'est le nom de mon fichier contenant les données (test.txt chez toi)
0
Cela fonctionne manuel. Merci à tous!
0