Comment effectuer une commande Ssi grep renvoie 1 seule ligne ?
Résolu
Julosdu13
Messages postés
3
Date d'inscription
Statut
Membre
Dernière intervention
-
Julosdu13 Messages postés 3 Date d'inscription Statut Membre Dernière intervention -
Julosdu13 Messages postés 3 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaite traiter des fichiers et recuperer des zones de textes particulieres de mon fichier pour ensuite les concatener sur une ligne dans un nouveau fichier, le probleme c est que des fois mon grep renvoir plusieurs lignes et donc ca ne marche pas.
Je voudrais donc rajouter une condition dans ma boucle du type if le nombre de ligne renvoye par grep est superieur a 1 alors faire autre chose...
Voici mon script
#!/bin/bash
currdir=`pwd`
echo "$currdir"| cut -f 8 -d '/' >> CS.file
ligands=`ls -d *`
for lig in $ligands;
do
cd $lig
if [ -f so1h-$lig.out ];
then
echo "$lig" >> ../CS.file
var=$(grep "NMR Sh" so1h-$lig.out| cut -c56-| grep "H"| grep "-")
sed -i 's/'"$lig"'/& '"$var"'/g' ../CS.file
else
echo "$lig" >> ../CS.file
sed -i 's/'"$lig"'/& NO RESULTS FOR '"$lig"'/g' ../CS.file
fi
cd ..
done
Merci beaucoup d avance :)
Je souhaite traiter des fichiers et recuperer des zones de textes particulieres de mon fichier pour ensuite les concatener sur une ligne dans un nouveau fichier, le probleme c est que des fois mon grep renvoir plusieurs lignes et donc ca ne marche pas.
Je voudrais donc rajouter une condition dans ma boucle du type if le nombre de ligne renvoye par grep est superieur a 1 alors faire autre chose...
Voici mon script
#!/bin/bash
currdir=`pwd`
echo "$currdir"| cut -f 8 -d '/' >> CS.file
ligands=`ls -d *`
for lig in $ligands;
do
cd $lig
if [ -f so1h-$lig.out ];
then
echo "$lig" >> ../CS.file
var=$(grep "NMR Sh" so1h-$lig.out| cut -c56-| grep "H"| grep "-")
sed -i 's/'"$lig"'/& '"$var"'/g' ../CS.file
else
echo "$lig" >> ../CS.file
sed -i 's/'"$lig"'/& NO RESULTS FOR '"$lig"'/g' ../CS.file
fi
cd ..
done
Merci beaucoup d avance :)
A voir également:
- Comment effectuer une commande Ssi grep renvoie 1 seule ligne ?
- Invite de commande - Guide
- Partager photos en ligne - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Commande terminal mac - Guide
- Mètre en ligne - Guide
2 réponses
Salut,
man grep :
Sinon, concernant :
Il y a plus simple :
;-))
man grep :
-m NUM, --max-count=NUM
Stop reading a file after NUM matching lines.
Sinon, concernant :
currdir=`pwd`
echo "$currdir"| cut -f 8 -d '/'
Il y a plus simple :
basename ${PWD}
;-))
Hello merci pour cettte reponse !
Le truc c est que je ne veux pas forcement lire seulement la premiere ligne, je voudrai pouvoir trier les lignes si jamais le grep m'en renvoie plus d'une.
Du coup je voudrai une boucle if avec comme condition si le grep renvoie une ligne alors je continue mon scrpit normalement sinon je lui rajoute d autres commandes :)
Le truc c est que je ne veux pas forcement lire seulement la premiere ligne, je voudrai pouvoir trier les lignes si jamais le grep m'en renvoie plus d'une.
Du coup je voudrai une boucle if avec comme condition si le grep renvoie une ligne alors je continue mon scrpit normalement sinon je lui rajoute d autres commandes :)
Dans ce cas tu testes avec un
grep -c 'motif':
$ cat fich
1 bla bla
2 bla bli bla
3 bla blu blo
4 bli bla
5 bly ble bla bli
6 bla bla bla
7 bla bla
8 bla bli blu
9 bla blu
$ if [ $(grep -c 'blo' fich) = 1 ]; then echo "Good"; else echo "Bad";fi
Good
$ if [ $(grep -c 'bli' fich) = 1 ]; then echo "Good"; else echo "Bad";fi
Bad
salut,
si tu veux appeler les sous-répertoires du répertoire en cours dans une boucle
autre chose : utiliser des chemins relatifs (le répertoire courant, par exemple) n'est pas une bonne idée àmha, car un script peut être exécuté de n'importe où.
pour compter le nombre de lignes comportant un motif, il y a
donc, quelque chose comme :
si tu veux appeler les sous-répertoires du répertoire en cours dans une boucle
for, la commande
ls, qui est toujours mauvaise dans un script, est fausse, et inutile :
for dir in ./*/
do
echo "$dir est un répertoire, pas besoin de faire de test"
done
autre chose : utiliser des chemins relatifs (le répertoire courant, par exemple) n'est pas une bonne idée àmha, car un script peut être exécuté de n'importe où.
pour compter le nombre de lignes comportant un motif, il y a
wc -l, ou l'option
-cde
grep(i lfaut lire les pages man !)
donc, quelque chose comme :
nbL=$(grep -c 'motif' fichier)
if test $nbL -gt 1
then
commandes "normales"
elif test $nbL -gt 1
autres commandes
fi