Forum Linux.débutant Programmation de commandes awk

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-2
20
juin
2022

Bonjour,

J'ai récemment appris à faire un peu de parsing de fichiers pour manipuler un fichier texte et enlever les éléments que je souhaite garder etc dans le projet d'un stage de recherche. Cependant, j'aimerais automatiser ce procédé grâce à un programme awk pour pouvoir faire toutes ces commandes "automatiquement" pour gagner du temps en changeant juste le fichier input file.

Merci à vous

  • # Quel est le besoin ? Quelle est la question ?

    Posté par  . Évalué à 5. Dernière modification le 20 juin 2022 à 15:34.

    Je connais très bien awk … Si tu veux je peux te le faire … mais pas gratos. Il me faudrait une expression de besoin.

    Pour info, il y a longtemps, j'avais écrit un resolveur de sudoku en awk … Je dois l'avoir encore au fin fond d'une boite mail. A l'époque je m'étais référé au bouquin "sed et awk" de chez o'reilly. Sinon une requête sur un moteur de recherche te donnera des tutoriaux sur sed et awk (quelques liens non exhaustifs):

    https://www.funix.org/fr/unix/awk.htm
    https://www.shellunix.com/awk.html
    https://connect.ed-diamond.com/GNU-Linux-Magazine/glmf-131/awk-le-langage-script-de-reference-pour-le-traitement-de-fichiers
    https://perso.univ-rennes1.fr/pierre.nerzic/SYS1A/Amphi%20SYS%202015%20partie%206%20:%20Awk%20et%20Sed.pdf

    Sinon la référence reste bien entendu la page ma,n awk de ton OS.

    la page man de la commande awk linux (gnu awk) : https://man7.org/linux/man-pages/man1/awk.1p.html

    Pour freeBSD: https://www.freebsd.org/cgi/man.cgi?query=awk&sektion=1

    Attention cependant : en fonction de l'implémentation (GNU, BSD, unix prorio), il peut y avoir des variantes. Si le script doit être portable, il faut éviter les extensions GNU et s'assurer en parcourant les manpages des OS sur lequel le script doit fonctionner que celui-ci s'exécutera correctement sur le système cible (il me semble que certains OS comme AIX ou Solaris ont deux binaires awk disponibles et que, pour certaines fonctionnalités avancées il faut utiliser une autre version que celle installée par défaut. Mais bon, j'avais vu ça en 2004-2006 et ma mémoire me fait un peu défaut).

    Sinon, s'il est possible d'installer GNU awk sur tous les systèmes sur lesquels le script doit tourner, la solution de facilité sera de développer le script en GNU Awk que tu installeras partout.

    • [^] # Re: Quel est le besoin ? Quelle est la question ?

      Posté par  . Évalué à 0.

      oulah beaucoup d'infos aha !

      Euh non je ne veux pas prendre quelqu'un pour ca je suis étudiant et il y a du contenu de recherche physique que vous n'allez pas comprendre mais je vais consulter vos liens merci à vous !

      • [^] # Re: Quel est le besoin ? Quelle est la question ?

        Posté par  . Évalué à 10. Dernière modification le 20 juin 2022 à 19:31.

        […] il y a du contenu de recherche physique que vous n'allez pas comprendre […]

        Je dois avouer que j'ai un peu de mal à rester de marbre lorsque je lis une affirmation de ce type — je ne dois pas être le seul, AMHA. J'espère juste que tu réalises que c'est pratiquement impossible de te fournir des renseignements pertinents avec une description, que je comprends, si j'en juge par tes propos, volontairement nébuleuse. Mais je peux me tromper sur tes intentions…

        En outre, la compréhension des données à traiter (par celui qui te fournit l'algorithme) est sans rapport aucun avec l'algorithme en question. Un exemple? On peut parfaitement reconnaître des données au format tabulaire et savoir comment les extraire, sans même avoir la moindre idée de ce qu'elles signifient.

        Tout ce dont un développeur a besoin, c'est une description fonctionnelle complète de la (ou des) procédure(s) de traitement. Après, ce que les données signifient, on s'en bat les steaks. Ce qui compte, c'est ce qu'on extrait, comment et sur quelle base ou règle, s'il y en a.

        Je ne saurais donc trop te conseiller, si tu souhaites encore récolter des pistes pertinentes sur cette question, de fournir des renseignements qui feront sortir ta question d'un flou artistique fort peu productif. Avec les renseignements dont on dispose ici, rien ne permet déjà d'affirmer que Awk est bien ce qu'il te faut et on pourrait tout aussi bien te suggérer de faire "ça" en Python, en C++, en Perl, en shell- ou en java- script, voire encore en brainfuck, avec sed ou bien en COBOL, tiens, pourquoi pas…

  • # Un exemple qui va bien?

    Posté par  . Évalué à 6. Dernière modification le 20 juin 2022 à 17:47.

    … et tant qu'on y est, un qui ne va pas bien serait aussi le bienvenu.

    Avant de confirmer (ou pas) le langage, il est de bon ton d'en vérifier la pertinence car, fréquemment, le diable se cache dans les détails. Une fois un concept généralisé, il peut arriver que le langage initial ne convienne plus et qu'un simple détail demande une complexité de programmation qui pourrait très bien être résolue en deux coups de cuillère à pot avec un langage approprié.

    Dans le genre de questions à se poser, j'entrevois

    • De quel(s) type(s) de fichier(s) s'agit-il?
    • Le format est-il fixe ou à séparateur?
    • Le séparateur est-il toujours le même ou doit-il être paramétrable?
    • Le jeu de caractères est-il stable, est-ce toujours le même jeu, ex. UTF8, ASCII, ISO-Latin1…
    • As-tu essayé avec un simple alias ? (EDIT: à supposer que tu aies déjà une commande pour ça)

    Ajoute celles-ci à la liste de totof2000, bien entendu.

  • # Après relecture, peut être tout simplement ...

    Posté par  . Évalué à 6.

    awk -f fichier_script_awk input_file

    Man de GNU awk :

    gawk [ POSIX or GNU style options ] -f program-file [—] file …

    -f program-file
    --file program-file
        Read the AWK program source from the file program-file, instead of from the first command line argument. Multiple -f (or --file) options may be used. 
    
    
  • # grep et cut

    Posté par  . Évalué à 5.

    Les commandes grep et cut peuvent très bien faire l'affaire pour des traitements simples. Je t'invite à te documenter aussi sur celles-ci :-). Avec bien sûr les "païpes" "|" qui vont bien, et la redirection de sortie standard ">".

    • [^] # Re: grep et cut

      Posté par  (Mastodon) . Évalué à 6.

      Je +1

      En général mon utilisation de awk se limite à un print $3 pour s'affranchir de la délimitation des champs, et ensuite je grep cut tr à volonté !

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: grep et cut

        Posté par  . Évalué à 4.

        Perso, je sed souvent à la difficulté…

        --> []

        • [^] # Re: grep et cut

          Posté par  (site web personnel, Mastodon) . Évalué à 3.

          Disons que pour faire une ou deux manips sur un fichier comme on ferait avec un éditeur de texte, sed est parfait (et c'est un éditeur issu de la même ligné que vi…) C'est quand il s'agit de faire des traitements plus complexes (des structures de documents plus complexes et/ou sur plusieurs parties et pas que la manipulation comme dans éditeur —on va par exemple faire des calculs selon les valeurs de certains champs etc.) que awk devient intéressant (et à l'origine c'était pour faire des rapport, créneau sur lequel une perle a pris le relais plus tard, et son fonctionnement se rapproche plus d'un tableur que d'un éditeur de texte)

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # sinon flex et bison

    Posté par  (site web personnel) . Évalué à 2.

    gawk est déjà un peu plus puissant (et mieux documenté) que awk

    • flex remplace lex plus efficacent pour remplacer le parsing de fichier de configuration variable : valeur (ou =, comme tu veux)
    • bison remplace mieux yacc, idem : mieux documenté

    tu peux évoluer vers perl (je recommande peux, même si j'ai pratiqué) ou python qui a les bonnes bibliothèques pour faire le tout

    si ton sujet est simple, gawk + bash suffira pour obtenir les bonnes sorties de données.
    s'il y a des règles de gestion, tu n'échapperas pas à un langage de traitement (python est un très bon investissement si tu veux devenir data scientist)

    à toi de préciser le besoin :-) reviens vers nous pour nous préciser tes choix, un exemple de données (anonymisées bien sûr), ça aiderait _o/

  • # Si il y a du CSV...

    Posté par  (Mastodon) . Évalué à 2.

    … ça devient très vite compliqué de faire ça avec le Awk classique. Mais :

    I recently added proper handling of CSV files to GoAWK, my POSIX-compatible AWK interpreter, and I think it’s a feature that will make AWK significantly more useful for developers and data analysts in our data-heavy world.

    https://benhoyt.com/writings/goawk-csv/

    Ceci dit, je n'ai pas encore essayé, mais tout ça m'a l'air bien sérieux. En tout cas la gestion native des CSVs ouvre beaucoup de nouveaux horizons (et au-delà).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.