Alternative a grep
Fermé
sedforever
-
20 déc. 2009 à 13:40
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 25 janv. 2010 à 20:26
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 25 janv. 2010 à 20:26
A voir également:
- Alternative a grep
- Coco.gg alternative - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Wawacity alternative - Accueil - Outils
- Grep plusieurs mots ✓ - Forum Linux / Unix
- Nommez une alternative libre au logiciel propriétaire winzip. ✓ - Forum Compression
8 réponses
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
22 déc. 2009 à 12:10
22 déc. 2009 à 12:10
Je souhaiterais récuperer les lignes du fichier A contenant la dernière chaîne de caractère du fichier B :(
$ cat B.C A.C |awk -F";" '{gsub("\r","")} ; NF > 12 {x[$NF]=$NF} ; NF < 12 {z=$2 ; gsub(" ","",z); if(x[z])print $0}' | head 3;160001 ;; ;1; ; ; ; ; 3;16000111 ;; ;1; ; ; ; ; 3;160002 ;; ;1; ; ; ; ; 3;16000201 ;; ;1; ; ; ; ; 3;16000202 ;; ;1; ; ; ; ; 3;160003 ;; ;1; ; ; ; ; 3;16000331 ;; ;1; ; ; ; ; 3;16000332 ;; ;1; ; ; ; ; 3;16000333 ;; ;1; ; ; ; ; 3;16000334 ;; ;1; ; ; ; ; $
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
20 déc. 2009 à 13:52
20 déc. 2009 à 13:52
Salut,
;-))
[tmpfs]$ cat A abc;5623986 bcd;577 efg;57789 hij;753357 klm;25445 [tmpfs]$ cat B azjrae;5623986 bqdem;577 [tmpfs]$ for i in $(awk -F";" '{ print $2}' B);do egrep "\b${i}\b" A;done > C [tmpfs]$ cat C abc;5623986 bcd;577 [tmpfs]$
;-))
Waww...
quel rapidité!!!!
Merci d'avance Jipicy, ton code marche également pour des fichiers et non pour mon exemple?
Quelque chose du type :
[tmpfs]$ cat $file/A.sshl
[tmpfs]$ cat $file/B.shl
[tmpfs]$ for i in $(awk -F";" '{ print $2}' B);do egrep "\b${i}\b" A;done > C
[tmpfs]$ cat $ file/C.shl
[tmpfs]$
Je m'excuse d'avance si niveau code je n 'ai pas ton niveau et si tu as pu voir des erreurs :(
En tout cas merci beaucoup, je pnse que ce que tu as répondu me suffira pour avancer :)
quel rapidité!!!!
Merci d'avance Jipicy, ton code marche également pour des fichiers et non pour mon exemple?
Quelque chose du type :
[tmpfs]$ cat $file/A.sshl
[tmpfs]$ cat $file/B.shl
[tmpfs]$ for i in $(awk -F";" '{ print $2}' B);do egrep "\b${i}\b" A;done > C
[tmpfs]$ cat $ file/C.shl
[tmpfs]$
Je m'excuse d'avance si niveau code je n 'ai pas ton niveau et si tu as pu voir des erreurs :(
En tout cas merci beaucoup, je pnse que ce que tu as répondu me suffira pour avancer :)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
sedforever
20 déc. 2009 à 14:23
20 déc. 2009 à 14:23
J'ai rien pigé ;-((
Re,
Moi non plus ;-(, mais je tente le coup ;-))
Moi non plus ;-(, mais je tente le coup ;-))
~$ rep=$PWD ~$ echo $rep /home/lami20j ~$ cat $rep/A.sshl abc;5623986 bcd;577 efg;57789 hij;753357 klm;25445 ~$ cat $rep/B.sshl zjrae;5623986 bqdem;577 ~$ awk -F";" 'BEGIN{while(getline<"B.sshl">0){sub(/.*;/,"");t[++n]=$0}}{for(i in t)if($2==t[i])print}' A.sshl > C.sshl ~$ cat $rep/C.sshl abc;5623986 bcd;577 ~$
Merci beaucoup Lami20j,
Ca marche :)
Mais j'ai un petit souci que j'avais oublié de préciser.
En fait, au niveau du fichier j'ai certaines chaînes de caractères se terminant par une lettre Majuscule.
Celles-ci ne sont pas selectionnées dans mon fichier final.
A
abc;5623986
bcd;577
efg;57789
hij;753357
klm;25445A
B
zjrae;5623986
bqdem;577
klm;25445A
C
abc;5623986
bcd;577
klm;25445A
Merci d'avance.
Ca marche :)
Mais j'ai un petit souci que j'avais oublié de préciser.
En fait, au niveau du fichier j'ai certaines chaînes de caractères se terminant par une lettre Majuscule.
Celles-ci ne sont pas selectionnées dans mon fichier final.
A
abc;5623986
bcd;577
efg;57789
hij;753357
klm;25445A
B
zjrae;5623986
bqdem;577
klm;25445A
C
abc;5623986
bcd;577
klm;25445A
Merci d'avance.
Merci Lamij20,
Pourrais-t-on récupérer également des chaînes de caractères non uniquement composée de chiffres?
Il y a certaines chaines de caractères que je dois récuperer avec une lettre majuscule en fin de chaîne.
Ca marche nickel pour récuperer toutes les autres chaînes dans mon fichier C mais pas pour celles du type 5897522A.
(C'est une donnnée que j'avais omis de préciser au départ, je suis desolé)
Merci d'avance.
et merci pour tout le reste
Pourrais-t-on récupérer également des chaînes de caractères non uniquement composée de chiffres?
Il y a certaines chaines de caractères que je dois récuperer avec une lettre majuscule en fin de chaîne.
Ca marche nickel pour récuperer toutes les autres chaînes dans mon fichier C mais pas pour celles du type 5897522A.
(C'est une donnnée que j'avais omis de préciser au départ, je suis desolé)
Merci d'avance.
et merci pour tout le reste
Salut,
J'ai testé chez moi et ça marche.
Peut être que les fichiers contiennent des espaces au d'autres caractères non imprimable.
Toutefois, je me demande pourquoi n'utilises-tu la solution de dubcek (merci ;-) qui est plus élégante que la mienne?
J'ai testé chez moi et ça marche.
Peut être que les fichiers contiennent des espaces au d'autres caractères non imprimable.
~$ cat a1 abc;5623986 bcd;577 efg;57789 hij;753357 klm;25445A ~$ cat a2 azjrae;5623986 bqdem;577 klm;25445A ~$ awk -F";" 'BEGIN{while(getline<"a2">0){sub(/.*;/,"");t[++n]=$0}}{for(i in t)if($2==t[i])print}' a1 abc;5623986 bcd;577 klm;25445A ~$
Toutefois, je me demande pourquoi n'utilises-tu la solution de dubcek (merci ;-) qui est plus élégante que la mienne?
J'ai testé celle de Dubcek mais ca ne fonctionne pas, j'ai des valeurs en trop dans le fichier final alors qu'avec ta solution, j'ai exactement les valeurs de B dans A , en dehors des chaînes numériques se terminant par une lettre :(
En tout cas merci beaucoup beaucoup.
Je vais essayer de chercher de mon côté ou est le souci.
Et si tu peux me dépanner, je suis vraiment preneur :)
T'es fort.....
En tout cas merci beaucoup beaucoup.
Je vais essayer de chercher de mon côté ou est le souci.
Et si tu peux me dépanner, je suis vraiment preneur :)
T'es fort.....
Merci beaucoup.
Cest vrai que j'ai pas été super clair ds mon code précédent.:(
Dsl
En fait je voulais juste remplacer dans le code mes exemples A, B et C par les noms des fichiers correspondant.
En tt ca s merci a vous deux jipicy et lamij20.:)
Bonne soirée je vais pouvoir avancer......
Tout ca pour filtrer un fichier generé en Cobol :( ............
Cest vrai que j'ai pas été super clair ds mon code précédent.:(
Dsl
En fait je voulais juste remplacer dans le code mes exemples A, B et C par les noms des fichiers correspondant.
En tt ca s merci a vous deux jipicy et lamij20.:)
Bonne soirée je vais pouvoir avancer......
Tout ca pour filtrer un fichier generé en Cobol :( ............
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
21 déc. 2009 à 08:46
21 déc. 2009 à 08:46
hello
$ cat a1 abc;5623986 bcd;577 efg;57789 hij;753357 klm;25445 $ $ cat a2 azjrae;5623986 bqdem;577 $ $ cat a1 a2 |awk 'BEGIN {OFS=FS=";"} ;{if(x[$2])print x[$2],$2;x[$2]=$1}' abc;5623986 bcd;577 $
Merci beaucoup dubcek.
J'aurais juste une question, dans le cas ou la position de la chaîne de caractère n'est pas équivalente entre les deux fichiers, est-ce que le code est modifié :
ex : fichier A
abc;5623986
bcd;577
efg;57789
hij;753357
klm;25445
Fichier B
abc;aki25;5623986
bcd;akit85;577
efg;5879atr;753357
En fichier de sortie C :
abc;5623986
bcd;577
hij;753357
Je sais que j 'en demande beaucoup mais merci d'avance.:)
Bonne journée
J'aurais juste une question, dans le cas ou la position de la chaîne de caractère n'est pas équivalente entre les deux fichiers, est-ce que le code est modifié :
ex : fichier A
abc;5623986
bcd;577
efg;57789
hij;753357
klm;25445
Fichier B
abc;aki25;5623986
bcd;akit85;577
efg;5879atr;753357
En fichier de sortie C :
abc;5623986
bcd;577
hij;753357
Je sais que j 'en demande beaucoup mais merci d'avance.:)
Bonne journée
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
21 déc. 2009 à 12:11
21 déc. 2009 à 12:11
je remplace $2, le deuxième champ, par $NF, le dernier champ:
$ cat a1 abc;5623986 bcd;577 efg;57789 hij;753357 klm;25445 $ $ cat a2 abc;aki25;5623986 bcd;akit85;577 efg;5879atr;753357 $ $ cat a1 a2 |awk 'BEGIN {OFS=FS=";"} ;{if(x[$NF])print x[$NF],$NF;x[$NF]=$1}' abc;5623986 bcd;577 hij;753357 $
Salut,
Pour sedforever
La solution de dubcek (voir message 18), est la meilleure puisque le lignes ne sont parcourus qu'une seule fois.
Tu peux exécuter la commande avec un time pour voir le temps d'exécution.
C'est presque instantané.
Pour dubcek
Je n'ai pas pensé à faire un test tout simplement sur l'existence de la clé de hash à la lecture de 2ème fichier ce qui permet un seul passage.
Faire un for sur chaque clé c'est très couteux. J'avais des ressources à consommer ;-))
Merci de m'avoir réveiller.
Pour sedforever
La solution de dubcek (voir message 18), est la meilleure puisque le lignes ne sont parcourus qu'une seule fois.
Tu peux exécuter la commande avec un time pour voir le temps d'exécution.
C'est presque instantané.
Pour dubcek
Je n'ai pas pensé à faire un test tout simplement sur l'existence de la clé de hash à la lecture de 2ème fichier ce qui permet un seul passage.
Faire un for sur chaque clé c'est très couteux. J'avais des ressources à consommer ;-))
Merci de m'avoir réveiller.
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
23 déc. 2009 à 08:07
23 déc. 2009 à 08:07
ma proposition du post 18 tient compte du fait qu'il peut y avoir plusieurs lignes dans le fichier A.C qui contiennent un champ 2 égal à un dernier champ du fichier B.C. Je ne sais pas si c'est ce que veut sedforever .