Bonjour,

Je suis débutant complet en shell. Mes repères en programmation sont vba et php... Bref vous voyez le contexte
J'ai passé pas mal de temps à lire les tutos awk et shell trouvé ici, et à taper sur Google, sans réussir à déméler mon truc... Ca m'a l'air pourtant simplisime, en vba ça m'aurait pris 10mn ! Mais j'ai besoin de faire cette routine en shell.

J'ai plusieurs fichiers contenants des valeurs qui m'intéressent et que je voudrais ordonner dans un nouveau fichier.
Voici un listing exemple de mes fichiers :
10.dossier -> fichier texte contenant plusieurs valeurs relatives à l'id 10 (on pourrait nommer ces valeurs sf10, sp10)
11.dossier -> fichier texte contenant plusieurs valeurs relatives à l'id 11 (on pourrait nommer ces valeurs sf11, sp11)
12.dossier -> fichier texte contenant plusieurs valeurs relatives à l'id 12 (on pourrait nommer ces valeurs sf12, sp12)
SrefSummary.txt -> fichier texte formaté ainsi : une ligne par id, en csv, contenant comme premier champ de chaque ligne l'id :
10,bla10,ble10
11,bla11,ble11
12,bla12,ble12

Je voudrais créer un nouveau fichier texte qui stoquera les infos ainsi :
sf10,sp10,10,bla10,ble10
sf11,sp11,11,bla11,ble11
sf12,sp12,12,bla12,ble12
C'est à dire 2 infos par id lues dans id.dossier, puis l'unique ligne de SrefSummary.txt commençant par id.
Puis retour chariot.
Puis même chose pour id suivant.

J'ai également récupéré un bout de code qui fait une partie du boulôt et que je cherche à modifier selon mes besoins. Celui ci combine shell et awk. Je ne suis pas capable de juger sa qualité...
Il crée un fichier temporaire en awk capable d'aller chercher sf10 et sp10 et d'autres valeurs dans 10.dossier

Ici la partie que j'ai essayé de modifier à mon niveau :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
for fic in `ls *.dossier */*.dossier 2> /dev/null`
do 
  no=$(echo $fic | tr "." "\n")
  awk -f /tmp/file_awk_mission_$$ $fic
  awk '/10/ {print $0}' SrefMemory.txt
  awk '/"$no[1]"/ {print $0}' SrefMemory.txt
  printf "\n"
done
* Mon premier problème est que la ligne 5 fonctionne, mais pas la ligne 6 : quand j'essaie d'utiliser une variable pour attraper la ligne "id" de SrefSummary.txt ça ne sort rien. Pourtant un echo de $no[1] donne bien le numéro d'id attendu.

* Mon deuxième problème concerne la mise en forme des valeurs sf10, sp10. Le fichier awk temporaire qui va lire dans les id.dossier est pour l'instant écrit ainsi (il va chercher plein de valeurs, moi seulement 2 m'intéressent, a[4] et a[8]) :
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
BEGIN{
   FS=":"
   j=0
   i=0
}
{
   if ( i >= 1 )
   {
      i++
   }
   if ( $2 == "Most severe flight" )
   {
      i=1
   }
   if ( i == 4 )
   {
      split($0,a)
   }
   if ( j >= 1 )
   {
      j++
   }
   if ( $2 == " Nb flight tot " )
   {
      j=1
   }
   if ( j == 3 )
   {
      split($0,b)
   }
}
END{
   if ( b[3] != "" )
   {
     FS="."
     split(FILENAME,c)
     printf ("%s%s%s%s%s%s%s%s%24s",b[3],b[4],b[8],a[3],a[4],a[7],a[6],a[8],a[9])
   }
}
Et là je n'arrive pas à utiliser correctement la commande printf de la ligne 37 pour formater l'impression de a[4] et a[8] seulement au lieu de toutes les valeurs actuellement imprimées : je voudrais supprimer les espaces que contiennent ces 2 strings a[4] et a[8], et les imprimer l'un après l'autre séparés par une virgule.

J'ai l'impression que c'est rien à faire ! Merci si vous m'avez lu jusque là...

Stéphane.