Extraction sous linux

Résolu
Bonjour,

j'ai besoin d'aide en toute urgences SVP !!

voila, je travaille en ce moment sur un fichier d'appels d'offres. de ce fichier j'ai extrait tous les codes postaux donc j'ai un liste de code postaux de 2299 lignes . voici un extrait ci-aprés (j'ai pris quelques lignes seulement ):

95640
95700
95800
95801
95870
95880
97057
97100
97102
97120

et maintenant je veux garder que les numeros des départements donc les deux premier chiffres. au début je l'ai fait avec "cut -b -2" mais il me donne que les deux premiers chiffres mais le probleme c'est que le département outre-mer se décompose de 3 chiffres et non de 2 , donc comment je fait pour extraire les numeros de département à partir des codes postaux des villes , en sachant que tous les départements se décomposent de deux chiffres apart le departement outre-mer qui se decompose de 3 chiffres. j'ai pensé à la boucle "if" mais je ne sais pas comment ecrire le programme. SVP, j'ai besoin de votre aide. et merci
Configuration: Windows XP Internet Explorer 7.0

2 réponses

  1. Modérateur
    Salut,

    Je ne peux pas tester, mais pourqoui pas une simple regex avec l'option -o ?!
    grep -Eo '^(9[7|8][0-9]|[0-9][0-69])' fichier

    1. Modérateur
      Salut,

      C'est la 1ère chose à laquelle j'ai pensé, le problème c'est que grep fait une correspondance pour chaque motif trouvé sur la ligne, d'où un résultat du genre :
      970
      971
      00
      971
      02
      971
      20
      ;-((

      PS. Je te croyais parti je ne sais où ;-)
    2. Modérateur
      @jipicyRe,

      Je ne comprends pas ton argument :-(

      Voici ce que j'obtiens comme résultat (bref c'est le même)
      lami20j@debian:~$ cat cp.txt
      95640
      95700
      95800
      95801
      95870
      95880
      97057
      97100
      97102
      97120
      lami20j@debian:~$ sh cp.sh
      95
      95
      95
      95
      95
      95
      970
      971
      971
      971
      lami20j@debian:~$ grep -Eo '^(9[7|8][0-9]|[0-9][0-69])' cp.txt
      95
      95
      95
      95
      95
      95
      970
      971
      971
      971
      lami20j@debian:~$ grep -Eo '^(9[7|8][0-9]|[0-9][0-69])' cp.txt  | wc -l
      10
      lami20j@debian:~$ sh cp.sh | wc -l
      10
      
    3. Modérateur
      @lami20jBen mon argument il tient à ce que j'obtiens ;-(((
      [tmpfs]$ cat toto
      32000
      93123
      94256
      94000
      95640
      95700
      95800
      95801
      95870
      95880
      97057
      97100
      97102
      97120
      
      [tmpfs]$ grep -Eo '^(9[7|8][0-9]|[0-9][0-69])' toto
      32
      00
      93
      12
      94
      25
      94
      00
      95
      64
      95
      70
      95
      80
      95
      80
      95
      95
      970
      971
      00
      971
      02
      971
      20
      [tmpfs]$  
      ;-\

      Si tu as une explication, je suis preneur ;-))
    4. Modérateur
      @jipicySalut,

      La version de grep ?!!!
      Regarde chez moi
      lami20j@debian:~$ cat cp.txt
      32000
      93123
      94256
      94000
      95640
      95700
      95800
      95801
      95870
      95880
      97057
      97100
      97102
      97120
      
      lami20j@debian:~$ grep -Eo '^(9[7|8][0-9]|[0-9][0-69])' cp.txt
      32
      93
      94
      94
      95
      95
      95
      95
      95
      95
      970
      971
      971
      971
      
      Voici la version de grep
      lami20j@debian:~$ grep --version
      GNU grep 2.5.3
      
      Copyright (C) 1988, 1992-2002, 2004, 2005  Free Software Foundation, Inc.
      This is free software; see the source for copying conditions.  There is NO
      warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    5. Modérateur
      @lami20j
      $ grep --version
      grep (grep de GNU) 2.5.1
      C'est fort probable, faudrait voir les "features" entre la 2.5.1 et la 2.5.3 pour être certain...
  2. Modérateur
    Salut,

    Une solution :
    #! /bin/sh
    
    #set -xv
    
    for line in $(cat ton_fichier)
    do
    case "$line" in
    97???|98???)    echo "${line::3}"
                    ;;
    *)              echo  "${line::2}"
                    ;;
    esac
    done
    ;-))