Alternative a grep

sedforever -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour à tous,

Je dois developper un script de la maniere suivante :

En entrée un fichier A et un fichier B en sortie le fichier C qui correspond au fichier A avec des lignes supprimées.

Dans mon fichier A, je voudrais récuperer les lignes qui ne contiennent que les chaines de caracteres numerique présentes dans B

ex

fichier A

abc;5623986
bcd;577
efg;57789
hij;753357
klm;25445

fichier B

azjrae;5623986
bqdem;577

en sortie je voudrais le fichier C suivant

fichier C

abc;5623986 (car 5623986 présent dans B)
bcd;577 (car 577 présent dans B)

En utilisant un grep je récupère egalement en plus dans C la ligne

efg;57789 (car 577 est présent dans la chaine caractère 57789)

En gros je vouddrais un grep qui me récupère uniquement la chaine de caractères desirée et non ses sous chaînes. :(

Merci davance pour vos réponses ..bone journéee à tous de dimanche sous la neige :)
Configuration: Windows XP Internet Explorer 7.0

8 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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;                    ;                    ;      ; ;
    $ 
    
    1
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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]$

    ;-))
    0
    1. sedforever
       
      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 :)
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > sedforever
         
        J'ai rien pigé ;-((
        0
  3. lami20j
     
    Re,

    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
    ~$
    
    0
    1. lami20j
       
      Re,

      Juste une autre version.
      De toute façon le résultat est le même, mais on ne sais pas ce qu'il veut vraiment ;-)
      0
    2. sedforever
       
      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.
      0
    3. sedforever
       
      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
      0
    4. lami20j > sedforever
       
      Salut,

      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?
      0
    5. sedforever
       
      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.....
      0
  4. sedforever
     
    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 :( ............
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    $ 
    
    0
    1. sedforever
       
      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
      0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    $ 
    
    0
  8. lami20j
     
    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.
    0
  9. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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 .
    0