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

Linux Discussion :

script qui modifie header (ASCII) d'un fichier


Sujet :

Linux

  1. #1
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut script qui modifie header (ASCII) d'un fichier
    Bonjour

    Je ne connais que quelques bases en scripts shell linux (mais j'apprends vite...) et j'aurais besoin d'aide.

    Je souhaite ecrire un script qui gere les headers d'images en format FITS.
    Une image FITS est composee d'un header en format ASCII, suivi de l'image en format binaire. Le header contient plusieurs champs de 80 caracteres. Chaque champ contient un mot-cle suivi d'un contenu. Le dernier champ du header contient le mot-cle "END" : ensuite c'est l'image.

    Je voudrais ecrire des scripts qui lorsqu'on leur donne un nom de fichier "image.fit", permettent de faire des operations diverses sur les mot-cles:
    - par exemple, balayer tous les headers et s'arreter aux headers ayant le mot-cle "EXPOSURE" et remplacer "EXPOSURE" par "EXPTIME".
    - ou alors renvoyer (avec l'instruction echo) le contenu du header ayant pour mot-cle "DATE-OBS"
    etc

    Est-ce c'est possible ?
    De quelles instructions j'aurais besoin ?
    Si vous pouviez m'orienter dans la bonne direction, et eventuellement me donner quelques bouts de code, je devrais pouvoir me debrouiller...

    Merci pour votre aide

  2. #2
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Si je veux remplacer la premiere occurrence de EXPOSURE par EXPTIME dans le header de l'image, ca a l'air de marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -i 's/EXPOSURE/EXPTIME/' image.fit
    Maintenant, si je veux afficher le champ EXPTIME du header ? Il faut afficher les 80 caracteres qui commencent par EXPTIME, comment faire ?

  3. #3
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Il faudrait savoir ce qui signale la fin du header. Ou est-il toujours de la même taille (les N premiers octets) ?.
    Pour être le plus complet possible il faudrait:
    1. séparer l'ensemble du header (selon le critère expliqué plus haut)
    2. l'éditer
    3. le recoller à l'image. (sans soucis dans *nix)

  4. #4
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Le header est compose d'une successions de champs de 80 caracteres, qui sont comme ca:

    La fin du header est un champ de 80 caractere qui commence par 'END' suivi de 77 espaces:

    Ce qu'il faudrait c'est un script qu'on appelle avec
    qui renvoie:
    MOT-CLE = valeur

  5. #5
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Ça ne me semble pas poser de problèmes.
    J'aimerais faire l'essai avec un ou deux échantillons.
    Les poster ou poster des URLs seraient une aide précieuse...

  6. #6
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Voici un lien ou on peut telecharger une image FITS:
    http://astrosurf.com/caron/mediane/test.fit

  7. #7
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Voilà déjà de quoi lire l'entête (brut de décoffrage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    while read -n80 L
    do
       [ "${L::3}" = "END" ] && break
       echo $L
    done <test.fit
    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SIMPLE = T
    BITPIX = 16
    NAXIS = 2
    NAXIS1 = 736
    NAXIS2 = 482
    MIPS-HI = 5081
    MIPS-LO = 4681
    MIPS-X1 = 0
    MIPS-Y1 = 0
    MIPS-X2 = 0
    MIPS-Y2 = 0
    MIPS-BIX= 1
    MIPS-BIY= 1
    MIPS-CCD= 1
    MIPS-FL = 0
    MIPS-SX = 0
    MIPS-SY = 0
    MIPS-NOR= 0.000000
    MIPS-CST= 0.000000
    DATE-OBS= '2010-04-17T23:05:39'
    UT-START= '23:05:39'
    EXPTIME = 60.
    Visiblement les mots-clés font systématiquement 8 caractères. Est-ce une des contraintes du format ?

  8. #8
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Et voici le script qui extrait la valeur souhaitée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    while read -n80 L
    do
       [ "${L::3}" = "END" ] && break
       [ "${L%% *}" = "$1" ] && echo $L
    done <test.fit

  9. #9
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Excellent, merci fransoo !!
    Oui les mot-cles font toujours 8 caracteres, c'est le format qui veut ca.

    Sinon je me demandais comment faire pour passer le fichier a examiner en paramètre ?
    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    while read -n80 L
    do
       [ "${L::3}" = "END" ] && break
       [ "${L%% *}" = "$1" ] && echo $L
    done <$2
    mais si j'ai plusieurs images et que je fais
    get_header.sh NAXIS *.fit
    ca ne renvoie le header que de la premiere image. Comment faire pour balayer toutes les images, et puis aussi pour afficher le nom des fichiers ?

  10. #10
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Ok. Essaye ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    for File in $2
    do
       while read -n80 L
       do
          [ "${L::3}" = "END" ] && break
          [ "${L%% *}" = "$1" ] && echo "$L dans $File"
       done <$File
    done

  11. #11
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Ca ne renvoie que le header pour le premier fichier...
    (je suis dans un repertoire qui contient 20 fichiers .fit)

  12. #12
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Citation Envoyé par jejerome Voir le message
    Ca ne renvoie que le header pour le premier fichier...
    (je suis dans un repertoire qui contient 20 fichiers .fit)
    Si on veut tous les fichiers .fit du répertoire courant alors c'est
    Il ya un moyen de vérifier dans un terminal en tapantça doit retourner la liste des fichiers séparés par espace. Donc attention à ce que leurs noms n'en contiennent pas !

  13. #13
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Si je tapedans un terminal, alors j'ai bien toute la liste des fichiers
    ngc6781_10.fit ngc6781_11.fit ngc6781_12.fit ngc6781_13.fit ngc6781_14.fit ngc6781_15.fit ngc6781_16.fit ngc6781_17.fit ngc6781_18.fit ngc6781_19.fit ngc6781_1.fit ngc6781_20.fit ngc6781_2.fit ngc6781_3.fit ngc6781_4.fit ngc6781_5.fit ngc6781_6.fit ngc6781_7.fit ngc6781_8.fit ngc6781_9.fit
    Si je met dans le script alors ca donne bien la réponse pour tous les fichiers. Mais c'est très lent, et j'ai l'impression que le script balaye les fichiers en entier sans s'arrêter au mot-clé 'END'. Chaque fichier fait 774 ko, alors que l'en tête est très court donc ca devrait être rapide...

    Enfin, mon problème c'est que je ne peux pas utiliser et passer "*.fit" en second paramètre. Alors j'ai le résultat seulement pour le premier fichier ngc6781_10.fit... Si j'ajoute au script ca n'affiche que
    ngc6781_10.fit
    Est-ce que c'est normal ?

    On va y arriver... merci pour toutes ces réponses!!

  14. #14
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Bon, après test je confirme que le script s'arrête bien au mot-clé 'END' (désolé d'avoir douté...)

    Sinon je ne vois pas comment passer un nom de fichier *.fit au script...

Discussions similaires

  1. Script qui vérifie si le fichier a été modifié
    Par 20132014 dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 29/10/2014, 00h55
  2. programme qui modifie le contenu d'un fichier
    Par da_latifa dans le forum Débuter
    Réponses: 11
    Dernier message: 27/10/2014, 17h06
  3. Réponses: 5
    Dernier message: 23/05/2014, 13h09
  4. [PHP 4] Petit Script Qui Permet De Supprimer Tous Les Fichiers D'un Dossier
    Par The_Haunted dans le forum Langage
    Réponses: 5
    Dernier message: 03/01/2009, 15h15
  5. Script qui ne fonctionne pas via un fichier Batch ?
    Par bilou95 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 31/12/2007, 16h18

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