Rechercher : dans
Par :

Chercher une chaine avec awk dans un fichier

Dernière réponse le 13 fév 2008 à 17:16:37 sam, le 13 fév 2008 à 10:55:50 
 Signaler ce message aux modérateurs

Bonjour,
Mon problème est comme suit :
J'ai un fichier "test" dans lequel je voudrai chercher une chaine exacte entrée par l'utilisateur .
Le fichier test est comme suit :
ch=a.chaine1,b.chaine2
ch1=a.chaine1,b.chaine2
ch2=c.chaine3
ch3=a.chaine4,b.chaine5,chiane6
etc...

Le script doit pouvoir localalisée par ex la chaine "chaine1" ou "chaine3" entrée par l'utilisateur et l'afficher entièrement "a.chaine1" ou encore "c.chaine3".
Si l'utilisateur entre par exemple "chai" le script rend une réponse négative.

Merci d'avance

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « Chercher une chaine avec awk dans un fichier » dans :
GRUB - La structure de fichier de configuration VoirLe fichier de configuration de GRUB Introduction Exemple de configuration type Explications Paramètres par défaut 1. Adressage des disques 2. title 3. root 4. kernel 5. initrd 6. rootnoverify 7. chainloader OBSERVATIONS
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Connecter le PC à la chaîne hifi sans fil VoirVotre PC est dans le bureau et votre chaîne hifi dans le salon et vous souhaiteriez profiter du son de votre installation hifi pour écouter vos MP3 stockés sur l'ordinateur ? Cette fiche a pour objectif de recenser les différentes possibilités de...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Connecter l'ordinateur à une chaîne HIFI VoirPourquoi brancher son PC sur une chaîne? Les ordinateurs fournissent désormais un son aussi bon que des chaînes hifi. Il est possible de s'en servir pour écouter de la musique notamment grâce aux fichiers mp3 qui restituent un son quasimment...
Fichier ISO (Image ISO) VoirFormat ISO Un fichier possédant l'extension .ISO est une image ISO, c'est-à-dire une image d'un disque (CD, DVD ou disque dur) sous forme de fichier, créer avec un logiciel de gravure. Comment lire un fichier ISO ? En l'absence de graveur, il...

1

jipicy, le 13 fév 2008 à 11:26:19

Salut,

Pourquoi avec "awk" ? Un simple "grep" devrait suffire, non ?
La recherche doit renvoyer que la chaine de caractères (avec les 2 caractère précédents) ou la ligne entière ?

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

sam, le 13 fév 2008 à 11:44:44

Comment faire alors?

Répondre à sam

3

jipicy, le 13 fév 2008 à 11:47:57

Ca dépend...

Tu n'as pas répondu !!!

La recherche doit renvoyer que la chaine de caractères (avec les 2 caractère précédents) ou la ligne entière ?

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

sam, le 13 fév 2008 à 11:51:28

Le grep ne doit faire ressortir que "a.chaine1" ou "c.chaine3" etc et non pas la ligne entière.

Répondre à sam

5

jipicy, le 13 fév 2008 à 11:56:38

 grep -o ".\.chaine3" fichier
 grep -o ".\.chaine3" fichier
Et en application :
ssh$ cat plop
ch=a.chaine1,b.chaine2
ch1=a.chaine1,b.chaine2
ch2=c.chaine3
ch3=a.chaine4,b.chaine5,chiane6

ssh$ var="chaine3"

ssh$  grep -o ".\.${var}" plop
c.chaine3
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

6

sam, le 13 fév 2008 à 12:02:17

Le grep -o n'existe pas sur aix :(
il n'y a que le grep -w mais qui retourne l'ensemble de la ligne :(

Répondre à sam

7

lami20j, le 13 fév 2008 à 12:02:19

Salut,

voilà, mais ce n'est pas efficace tant qu'on ne connais pas exactement la structure complète de ton fichier

la chaîne à récupérée a toujours le format
LETRRE.chaineNUMERO ?!

root@debian:~# cat fic
ch=a.chaine1,b.chaine2
ch1=a.chaine1,b.chaine2
ch2=c.chaine3
ch3=a.chaine4,b.chaine5,chiane6
etc...

root@debian:~# grep -Eo '[a-zA-Z]\.chaine1' fic
a.chaine1
a.chaine1
root@debian:~#

lami20j

Répondre à lami20j

8

lami20j, le 13 fév 2008 à 12:05:23

Le grep -o n'existe pas sur aix :(
et avec perl ça te vas?
lami20j

Répondre à lami20j

9

sam, le 13 fév 2008 à 12:09:40

Je suis désolé mais ça ne marche pas.
Voici le résultat d'execution sur le fichier fic :
grep -E "[a-zA-Z]\.chaine1" fic
résultat :
ch=a.chaine1,b.chaine2
ch1=a.chaine1,b.chaine2

Le paramètre "o" n'existe pas pour grep sur aix

Répondre à sam

10

lami20j, le 13 fév 2008 à 12:14:49

Et ça?

perl -ne 'print $1,"\n" if /=(\w*\.\w+1),/' fic
--

lami20j

Répondre à lami20j

11

jipicy, le 13 fév 2008 à 12:15:33

Ben désolé, tu ne l'avais pas spécifié aussi...

En plus je me suis aperçu qu'il manquait le paramètre "\b" à l'expression pour quelle soit exacte :

grep -o ".\.chaine3\b" fichier
Essaye avec "perl" alors comme suggéré par" lami20j".

;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

12

sam, le 13 fév 2008 à 12:19:07

Mais elle est où ma variable sur laquelle je vais effectuer ma recherche???

Répondre à sam

13

sam, le 13 fév 2008 à 12:25:39

Pour l'instruction perl, elle ne répond pas à ma question dans la mesure où elle délimite la chaine à rechercher avec "=" et "," alors qu'il y a d'autres chaine qui sont délimitées par "=" et la fin de la ligne. En plus elle affiche le premier paramètre $1!!!

Répondre à sam

14

lami20j, le 13 fév 2008 à 12:29:46

Justement j'ai dit dans mon message qu'on a besoin de la structure de ton fichier
http://www.commentcamarche.net/forum/affich 5010161 chercher une chaine avec awk dans un fichier#7
On ne peux pas deviner ce que ton fichier contient
lami20j

Répondre à lami20j

15

sam, le 13 fév 2008 à 12:35:21

Mon fichier c'est exactement ce que je vous ai lister :

ch=a.chaine1,b.chaine2
ch1=a.chaine1,b.chaine8
ch2=c.chaine3
ch3=a.chaine4,b.chaine5,chiane6
ch4=a.chaine4,b.chaine8,chiane9


en changeant juste les noms c tout!

Répondre à sam

16

lami20j, le 13 fév 2008 à 13:14:37
  • +2

root@debian:~# cat fic
ch=a.chaine1,b.chaine2
ch1=a.chaine1,b.chaine2
ch2=c.chaine3
ch3=a.chaine4,b.chaine5,chiane6
etc...

root@debian:~# cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;

my %h;
print "Entrez la chaine à chercher : ";
chomp(my $ch = <STDIN>);

while(<>){
  next unless /(\w*\.*$ch)/;
  $h{$1}++;
}
print keys %h," trouvé ",values %h," fois\n";
__END__
root@debian:~# perl ccm.pl fic
Entrez la chaine à chercher : chaine1
a.chaine1 trouvé 2 fois
root@debian:~#

lami20j

Répondre à lami20j

17

sam, le 13 fév 2008 à 14:15:57

Merci lami20j :)
le script marche bien. Cependant, je voudrais faire appel à ce script perl à partir de mon script korn shell et pour ce je voudrai une valeur de retour pour savoir si l'élément entré par l'utilisateur a été trouvé ou non.
Comment faire sachant bien que je ne connais pas perl du tout :(

Répondre à sam

18

lami20j, le 13 fév 2008 à 14:26:13

Par exemple

root@debian:~# cat ccm.sh
#!/bin/sh

perl /home/lami20j/ccm.pl $1
root@debian:~# sh ccm.sh fic
Entrez la chaine à chercher : chaine1
a.chaine1 trouvé 2 fois
root@debian:~#

lami20j

Répondre à lami20j

19

sam, le 13 fév 2008 à 15:41:52

Non, c pas l'appel du script shell! ça je sais faire :)
Je voudrai la valeur de retour à savoir "a.chaine1".

Répondre à sam

20

lami20j, le 13 fév 2008 à 15:45:30

Mets tu as la valeur de retour

a.chaine1 trouvé 2 fois
lami20j

Répondre à lami20j