IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Lire fichier comme un tableau


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Lire fichier comme un tableau
    Bonjour,

    Est-il possible de lire un fichier comme un tableau?
    Exemple: fichier[12] donne le 13ème caractère du fichier

    C'est pour récupérer des partie précises d'un fichier sans retour à la ligne.
    Exemple :
    Dans le fichier suivant, je veux récupérer les caractères 21 à 22 et 111 à 113
    Donc récupérer le "abc" et le "def"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12345678901234567890abc456789012345678901234567890123456789012345678901234567890123456789012345678901234567890def456789012345678901234567890
    doit devenir "abcdef"
    Les 123456780 peuvent être n'importe quoi.

    Actuellement je fais simplement des head et tail. Comme il y a des caractères qui ne s'affiche pas (ex: le caractère nul) je ne peux pas stocker les résultat dans une variable.

    Je fais donc:
    tail -c+21 fichier > tmp
    head -c3 tmp > fichier_resultat
    tail -c+112 fichier > tmp
    head -c3 tmp >> fichier_resultat

    Comme j'ai pas mal de caractères à récupérer, j'essaye de trouver une méthode plus rapide que de lire/écrire à chaque fois sur le disque.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Il suffit de mettre ton fichier dans une variable et de te servir du développement des paramètres.

    Contenu du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cat plop 
    12345678901234567890abc456789012345678901234567890123456789012345678901234567890123456789012345678901234567890def456789012345678901234567890
    Transformation en variable
    Contenu de la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo ${A}
    12345678901234567890abc456789012345678901234567890123456789012345678901234567890123456789012345678901234567890def456789012345678901234567890
    Affichage à partir du caractère 20 et des 3 suivants , puis du 110
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo ${A:20:3}
    abc
     
    $ echo ${A:110:3}
    def
    Concaténation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo ${A:20:3}${A:110:3}
    abcdef

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cut -c 21-23,111-113 tonFichier
    abcdef
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cut -c 21-23,111-113 tonFichier
    abcdef
    ...
    T'es vraiment navrant toi

    Zipe... de service

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut


    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    c'est l'effet "monday morning" ... mais bon normalement le mardi.... c'est sensé être fini

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Affichage à partir du caractère 20 et des 3 suivants , puis du 110
    A titre indicatif, cette syntaxe ne marche pas pour tous les shells:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A=abcdef
    $ echo ${A:2:3}
    ksh: ${A:2:3}: 0403-011 The specified substitution is not valid for this command.
    Raison de plus pour utiliser 'cut'!

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,
    Citation Envoyé par jack-ft Voir le message
    A titre indicatif, cette syntaxe ne marche pas pour tous les shells:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A=abcdef
    $ echo ${A:2:3}
    ksh: ${A:2:3}: 0403-011 The specified substitution is not valid for this command.
    Raison de plus pour utiliser 'cut'!
    Ça c'est de la mauvaise foi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ksh --version
      version         sh (AT&T Research) 93u 2011-02-08
    $ A=abcdef
    $ echo ${A:2:3}
    cde
    Suffit d'utiliser la bonne version

    Et puis y'a qu'à utiliser la version portable multi-lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed -r 's/.{20}(...).{87}(...).*/\1\2/' ../plop 
    abcdef

  9. #9
    Invité
    Invité(e)
    Par défaut
    Tout d'abord merci pour vos réponses.

    Voici un exemple du début du fichier. Il y a des caractères nul "(nul)" dans l'exemple ci-dessous. Et il peut y avoir des retour chariot en fait, donc cet exemple devrait être complet.
    E(nul)(nul)0_57PY
    E(nul)(nul)0_57PYE(nul)(nul)0_57PY
    En hexadécimal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    45 00 00 30 5f 35 37 50 59 0a 45 00 00 30 5f 35 37 50 59 45 00 00 30 5f 35 37 50 59
    A=$(< fichier )
    echo ${A:0:3}
    Cela ne tiens pas compte du caractère nul, il renvoie "E0_"

    cut -c 1-4 fichier
    cut -c 10-25 fichier
    Ca affiche bien le caractère nul. Mais le retour chariot pose problème.

    sed -r 's/.{1}(...).{4}(..).*/\1\2/' fichier
    idem que le cut

    (>_<)

    Y a-t-il moyen de faire la même chose en hexa? Ca permettra sans doute de résoudre ce problème?

    ps: J'utilise cygwin sous windows, ça me permet de me familiariser avec le shell unix/linux sans avoir besoin d'un linux installé sur mon pc. C'est utile pour mon boulot

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Beginner.j Voir le message
    Il y a des caractères nul "(nul)"
    Et il peut y avoir des retour chariot
    Si tu ne souhaites pas garder les nul et return, tu peux au préalable les remplacer par un caractère quelconque (et non les supprimer (ce qui changerait la place de ceux que tu cherches)):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tr '\0\r\n' '~~~' fichier | cut -c 1-4,10-25
    PS: '0a' en hexa est le caractère numéro 10 (en base dix), c'est-à-dire Ctrl-J (J est la 10ème lettre), également connu sous le nom de 'line feed', qui représente généralement une fin de ligne sous Unix et que l'on écrit (pour tr) sous la forme \n
    '0d' en hexa est le caractère numéro 13 (en base dix), c'est-à-dire Ctrl-M (M est la 13ème lettre), également connu sous le nom de 'carriage return' ou 'return', qui représente généralement une fin de ligne sous MacOsX et que l'on écrit (pour tr) sous la forme \r
    Sous d'autres OS, la fin de ligne peut être représentée par la suite C-M C-J
    (comme sur une machine à écrire: on ramène le chariot au début de ligne (CR = décalage horizontal) et on tourne le chariot d'un cran (LF = décalage vertical)).

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Beginner.j Voir le message
    ps: J'utilise cygwin sous windows, ça me permet de me familiariser avec le shell unix/linux sans avoir besoin d'un linux installé sur mon pc. C'est utile pour mon boulot
    Moi aussi, j'utilisais cygwin, mais, à titre indicatif, l'installation de VirtualBox et d'une Ubuntu (hors temps de téléchargement) prend moins d'un quart d'heure (et quelques (sic!) octets sur le disque...) et ça permet (comme cygwin) d'avoir un linux sans rebooter le PC.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire fichier CSV avec tabulation comme séparation
    Par theNoob dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2009, 18h52
  2. Lire/écrire fichier comme pour les fichiers .ini
    Par AliHome dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/12/2008, 14h26
  3. Réponses: 4
    Dernier message: 07/02/2006, 00h25
  4. Réponses: 20
    Dernier message: 22/03/2005, 21h07
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo