logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 21-08-2018 09:39:17

Slyfox
Membre
Inscription : 15-12-2013

[Résolu] Traitement fichier, remplacer boucle while avec awk

Bonjour les ami(e)s smile

Voici le contenu d'un fichier nommer fichier.txt:

Jean|10|Chat|Noir
Paul|30|Poisson|Rouge
Pierre|5|Chien|Blanc



Et j'aimerais analyser ce fichier selon le prénom (les champs en retour ne sont pas forcément les même selon les prénoms).

while read line; do
  Tableau+=($(awk -F [\|] '{if ($1 == "Jean") {printf "%s %s" ,$1,$2}}' <<< "$line"))
  Tableau+=($(awk -F [\|] '{if ($1 == "Paul") {printf "%s %s %s %s" ,$1,$2,$3,$4}}' <<< "$line"))
  Tableau+=($(awk -F [\|] '{if ($1 == "Pierre") {printf "%s %s %s" ,$1,$2,$3}}' <<< "$line"))
done < "fichier.txt"

echo "${Tableau[@]}"



Voici le résultat voulu:

Jean 10 Paul 30 Poisson Rouge Pierre 5 Chien



Et là j’obtiens bien le résultat dans un tableau.

Maintenant, je pense que cette manière donne effectivement le résultat attendu mais j'aimerais savoir si il est possible (certainement que oui) de le faire uniquement avec awk ? (ou une autre manière  moins lourde pour le système il semble que awk pompe plus de ressource que d'autre commande surtout si il y a beaucoup de lignes a traité, donc plus lent)

NB
L'exemple ci-dessus a été très simplifié, en fait le tableau doit me servir à créer des lignes de commande pour créer une boite de dialogue yad --form, je verrai par la suite si il est nécessaire de détailler ce problème.

Dernière modification par Slyfox (22-08-2018 15:04:04)

Hors ligne

#2 21-08-2018 10:09:54

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

cat monscript.awk


#!/usr/bin/gawk -f

BEGIN { FS="|" }

/^Jean/   { printf "%s %s " ,$1,$2 }
/^Paul/   { printf "%s %s %s %s " ,$1,$2,$3,$4 }
/^Pierre/ { printf "%s %s %s " ,$1,$2,$3 }


chmod 755 monscript.awk

./monscript.awk fichier.txt


Jean 10 Paul 30 Poisson Rouge Pierre 5 Chien

Dernière modification par Beta-Pictoris (21-08-2018 10:14:01)

Hors ligne

#3 21-08-2018 11:02:52

Slyfox
Membre
Inscription : 15-12-2013

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

Salut Beta-Pictoris smile

Merci pour ta réponse, autant pour moi si je ne l'ai pas bien précisé, il faut que le résultat soit mis dans un tableau.

Hors ligne

#4 21-08-2018 11:20:27

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

#!/usr/bin/gawk -f

BEGIN { FS="|" }

/^Jean/   { printf "%s %s\n" ,$1,$2 }
/^Paul/   { printf "%s %s %s %s\n" ,$1,$2,$3,$4 }
/^Pierre/ { printf "%s %s %s\n" ,$1,$2,$3 }



mapfile Tableau < <(./monscript.awk fichier.txt)

Dernière modification par Beta-Pictoris (22-08-2018 08:59:23)

Hors ligne

#5 22-08-2018 09:18:35

Slyfox
Membre
Inscription : 15-12-2013

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

Merci pour tes réponses, sinon une autre solution similaire (trouver sur la toile) en bash.

Contenu du fichier:

Jean|10|Chat|Noir
Paul|30|Poisson|Rouge
Pierre|5|Chien|Blanc



#! /bin/bash

tableau=($(awk -F [\|] '{
if ($1 == "Jean")
  {printf "%s %s " ,$1,$2}
 
else if ($1 == "Paul")
  {printf "%s %s %s %s " ,$1,$2,$3,$4}

else if ($1 == "Pierre")
  {printf "%s %s %s " ,$1,$2,$3}
}'
"fichier.txt" ))

echo "${tableau[@]}"




En fait, je me poser la question si on pouvait créer un tableau directement avec awk dans un script bash ?
J'ai bien vu qu'on pouvait utiliser un tableau déjà fait et le traiter avec une boucle for, mais j'ai pas trouvé comment on pouvait le créer, à moins que cela ne soit possible (?) roll .

Dernière modification par Slyfox (22-08-2018 09:19:39)

Hors ligne

#6 22-08-2018 09:24:47

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

Slyfox a écrit :

En fait, je me poser la question si on pouvait créer un tableau directement avec awk dans un script bash ?



Les tableaux créés dans awk n'existe que dans awk. Donc non. C'est pareil avec les tableaux créés dans bash,
ils sont intimement liés à l'interpréteur en cours d'exécution (c'est dans sa zone de mémoire). En plus
les représentations internes des tableaux ne sont certainement pas les mêmes en bash et awk.

En ligne

#7 22-08-2018 10:11:19

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk


#! /bin/bash

tableau=($(awk -F [\|] '{
if ($1 == "Jean")
  {printf "%s %s " ,$1,$2}
 
else if ($1 == "Paul")
  {printf "%s %s %s %s " ,$1,$2,$3,$4}

else if ($1 == "Pierre")
  {printf "%s %s %s " ,$1,$2,$3}
}'
"fichier.txt" ))

echo "${tableau[@]}"


Par contre, si tu fais ça, chaque terme va être placé dans sa propre case du tableau. C'est que tu veux ?

Hors ligne

#8 22-08-2018 11:02:29

Slyfox
Membre
Inscription : 15-12-2013

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

Beta-Pictoris a écrit :

Les tableaux créés dans awk n'existe que dans awk. Donc non. C'est pareil avec les tableaux créés dans bash,
ils sont intimement liés à l'interpréteur en cours d'exécution (c'est dans sa zone de mémoire). En plus
les représentations internes des tableaux ne sont certainement pas les mêmes en bash et awk.


Salut,
Cela me répond à l'une de mes questions, merci.

Beta-Pictoris a écrit :



Par contre, si tu fais ça, chaque terme va être placé dans sa propre case du tableau. C'est que tu veux ?


Oui, ça me pose pas de problème, bien au contraire ainsi je peux récupérer l'une des cases à souhait.

Hors ligne

#9 22-08-2018 12:19:03

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

Dans ces conditions, mon premier script awk fait l'affaire. Il faut juste insérer le résultat dans un tableau:

tableau=( $(./monscript.awk fichier.txt) )

Hors ligne

#10 22-08-2018 15:03:42

Slyfox
Membre
Inscription : 15-12-2013

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

@ Beta-Pictoris

Encore merci, je mets cette discussion en résolue.

Bonne journée smile

Hors ligne

#11 30-08-2018 07:25:12

Severian
Membre
Distrib. : Debian GNU/Linux 9.4 (stretch)
Noyau : Linux 4.14.0-0.bpo.3-amd64
(G)UI : Openbox 3.6.1-4
Inscription : 13-12-2014

Re : [Résolu] Traitement fichier, remplacer boucle while avec awk

bon comme je suis un mooc sur le langage C, je me suis demandé si c'était faisable ...

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
  char discours[101] = {'\0'};
  char tab3D[3][4][51] = {{{'\0'}, {'\0'}, {'\0'}}};
  for (int i = 0; i < 3; i++)
  {
    scanf("%s ", discours);
    int tailDiscours = strlen(discours);
    int k = 0;
    int l = 0;
    for (int j = 0; j < tailDiscours; j++)
    {
      if (discours[j] == '|')
      {
        tab3D[i][k][l] = '\0';
        l = 0;
        k++;
      }
      else
      {
        tab3D[i][k][l] = discours[j];
        l++;
      }
    }
  }
  for (int i = 0; i < 3; i++)
  {
    if (strcmp(tab3D[i][0], "Jean") == 0)
    {
      for (int j = 0; j < 2; j++)
      {
        printf("%s ", tab3D[i][j]);
      }
      //~ printf("%s %s ", tab3D[i][0], tab3D[i][1]);
    }
    if (strcmp(tab3D[i][0], "Paul") == 0)
    {
      for (int j = 0; j < 4; j++)
      {
        printf("%s ", tab3D[i][j]);
      }
      //~ printf("%s %s %s %s ", tab3D[i][0], tab3D[i][1], tab3D[i][2], tab3D[i][3]);
    }
    if (strcmp(tab3D[i][0], "Pierre") == 0)
    {
      for (int j = 0; j < 3; j++)
      {
        printf("%s ", tab3D[i][j]);
      }
      //~ printf("%s %s %s ", tab3D[i][0], tab3D[i][1], tab3D[i][2]);
    }
  }
  printf("\n");
}



je récupère les données pour les mettre dans un tableau à 3 dimensions, donc chaque terme est dans sa propre case.

Hors ligne

Pied de page des forums