Extrait de lignes d'un fichier unix

Résolu
Coco44 -  
 Coco44 -
Bonjour,

je cherche à "découper" un fichier unix en 3 fichiers selon la présence ou non d'une chaîne de caractère à des positions précises dans le fichier initial.

En gros, si la chaîne 'XXX' est trouvée de la position 5 à 7 --> Sortie vers fichier A
...Si la chaîne 'YYY' est trouvée de la position 15 à 17 --> Sortie vers fichier B
...

Avec la commande suivante :
grep 'XXX' mon_fichier | cut -c5-7 > fichierA
=> J'extrait seulement les caractères 5 à 7 dans mon fichier A alors qu'il me faut la ligne entière.

Comment obtenir ce résultat ?

Merci d'avance de vos réponses.

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    $ ls
    plop
    
    $ cat plop
    acbdXXXhijklmnopqrstuvwxyz
    abcdefghijklmnYYYrstuvwxyz
    abcdefghXXXlmnopqrstuvwxyz
    abYYYfghijklmnopqrstuvwxyz
    
    $ sed -n '/^.\{4\}XXX/w fichA' plop
    
    $ sed -n '/^.\{14\}YYY/w fichB' plop
    
    $ ls
    fichA  fichB  plop
    
    $ cat fichA
    acbdXXXhijklmnopqrstuvwxyz
    
    $ cat fichB
    abcdefghijklmnYYYrstuvwxyz
    
    $
    1
    1. Coco44
       
      merci ça marche pas trop mal... par contre j'ai un souci parce que la chaine recherchee est assez longue et au delà de 4 caractères ça ne marche pas !!
      La vraie chaine recherchée est : '+0000000000'
      En recherchant +000 ça marche
      mais +0000 non.
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Affiche un exemple concret des chaines recherchées dans leur contexte, s'il te plaît, merci.
      0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Sinon le plus simple c'est encore avec "awk" :

    $ ls
    bar.awk  toto
    
    $ cat toto
    C01IC+0000003822+0000000000+0000000000+00+00000
    C01IC+0000003822+0000000000+0006593856+01+00000
    C01IC+0000003822+0000000000+0006593856+01+00001
    
    $ cat bar.awk
    $4 ~ /0000000000/ && $5 ~ /00/ && $6 ~ /00000/ { print $0 >> "fichA" }
    $4 !~ /0000000000/ && $5 !~ /00/ && $6 ~ /00000/ { print $0 >> "fichB" }
    $4 !~ /0000000000/ && $5 !~ /00/ && $6 !~ /00000/ { print $0 >> "fichC" }
    
    $ awk -F'+' -f bar.awk toto
    
    $ ls
    bar.awk  fichA  fichB  fichC  toto
    
    $ cat fichA
    C01IC+0000003822+0000000000+0000000000+00+00000
    
    $ cat fichB
    C01IC+0000003822+0000000000+0006593856+01+00000
    
    $ cat fichC
    C01IC+0000003822+0000000000+0006593856+01+00001
    $

    ;-))
    1
    1. Coco44
       
      sympa la solution ! par contre je comprends pas les $4 $5 et $6.
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      On définit le séparateur de champs comme étant "+" (le signe plus), -F'+'.
      Ensuite on compare les champs avec des conditions :

      $4 ~ /0000000000/ && $5 ~ /00/ && $6 ~ /00000/ { print $0 >> "fichA" }

      Si le champs "4" ($4) est égal à /0000000000/ et (&&) le champ 5 à /00/ et le champ 6 à /00000/ on écrit la ligne ($0) dans fichA.

      etc.
      0
    3. Coco44
       
      ok, je pensais que c'était à la 4ème occurrence de '+', la 5ème et la 6ème donc ça collait pas.

      Merci, je vais voir quelle solution je prends au final (ça doit être un script réutilisable donc avec des paramètres comme le fichier d'entrée, le séparateur ou la position...).
      0
  3. Coco44
     
    Voici les 3 différentes lignes :

    C01IC+0000003822+0000000000+0000000000+00+00000 -> Fichier A
    C01IC+0000003822+0000000000+0006593856+01+00000 -> Fichier B
    C01IC+0000003822+0000000000+0006593856+01+00001 -> Fichier C

    Je dois tester 3 champs différents qui sont en fait des numériques signés (+001230...). Les champs en questions sont les 3 derniers de chaque ligne. Je dois éclater ces lignes dans 3 fichiers :
    - Fichier A : les 3 champs sont à 0.
    - Fichier B : champ 1 et 2 renseignés mais champ 3 à 0.
    - Fichier C : aucun des champs n'est à 0.
    0
  4. Coco44
     
    désolé c'est bon ! mon fichier en entrée déconnait (un caractère à la con...).
    Donc j'ai bien extrait mes données vers le fichier A.
    Par contre comment je peux extraire les lignes dans lesquelles la chaîne n'a pas été trouvée ?
    0
    1. Coco44
       
      arrfff, j'ai trouvé finalement : il faut mettre /!w au lieu de /w
      Merci de ton aide pour la commande, tout marche impec maintenant !
      0