apprentissage du bash

apprentissage du bash - Shell/Batch - Programmation

Marsh Posté le 16-02-2009 à 11:48:32    

Bonjour a tous,  
je m'initie a la programmetion en bash .
je cherche a lire un (très) gros fichier et a en sotir des paquets de lignes dans des fichiers incrémentés.
après des aller/retour sur forums et tuto, j'ai fais ce petit bout de code (*honte*)  
 

Code :
  1. n = 1
  2. for (( i = 67 ; i = 200 ; i+10 ))
  3. for (( j = i ; j=i+20 ; j++))
  4. do
  5. awk '{while($1 < j) print $1,$2,$3,$4 }'  tout.dat > res$n.dat
  6. n ++
  7. done
  8. done


 
apparemment, il ne reconnait meme pas n = 1, car il me ressort et se bloque:
 

Code :
  1. ./tryrun20: line 1: n: command not found


 
je ne trouve pas la solution a mon probleme sur les tuto/forums... (*re-honte*), c'est pourquoi je viens solliciter les conseils des "grands" :)
merci d'avance ;)

Reply

Marsh Posté le 16-02-2009 à 11:48:32   

Reply

Marsh Posté le 16-02-2009 à 11:54:09    

Je veux pas dire de bêtise, mais il me semble que les espaces ne sont pas permis.
Donc : n=1


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 16-02-2009 à 12:09:10    

exact! je viens de voir ça merci bcp :)
ya encore d'autre pb de syntaxe... je vais m'y coller plus serieusement
Merci bcp a toi a bonne journée :)


Message édité par fanchois le 16-02-2009 à 12:09:33
Reply

Marsh Posté le 16-02-2009 à 12:27:32    

= en contexte arithmétique, c'est l'affectation, pas la comparaison.

Reply

Marsh Posté le 16-02-2009 à 16:22:46    

De toute façon, la syntax for (( ; ; )) n'est pas portable. Il vaut mieux utiliser while.

Reply

Marsh Posté le 18-02-2009 à 11:31:32    

coucou,
j'ai essayé de faire mieux qu'au début, mais cette fois je pense avoir cerné le probleme: je crois que le awk ne trouve pas la variable que je voudrais pour "borner" ma lecture... dans le man awk ils parlent de -v (dans le BEGIN) donc j'ai essayé ça sans plus de succès, *O rage, O desespoir*
y'a-t-il une lumliére au bout de la nuit?
 

Code :
  1. n=1;
  2. i=67;
  3. while [ "$i" -lt 200 ];do
  4. MAX=$(expr $i + 20)
  5. echo $MAX
  6. echo $i
  7. echo $n
  8. awk -v MAX=$MAX -v i=$i  '{while($1 > i && $1 < MAX) print $0}' tout.dat > res$n.dat
  9. n=$(expr $n + 1)
  10. i=$(expr $i + 10)
  11. done


 
merci d'avance :)


Message édité par fanchois le 18-02-2009 à 11:38:16
Reply

Marsh Posté le 18-02-2009 à 12:51:37    

Pour infos, en Unix standard (et probablement en bash aussi), il existe la fonction split qui découpe un gros fichiers en plusieurs petits fichiers. On peut lui donnr le nombre de lignes maximum par fichier, etc.
 
Autrement, on peut aussi faire ça avec des head ... | tail ....
 
Sinon, la ligne du awk me parait étrange à cause du while, car awk fait une boucle implicite. D'autre part, il n'y a pas besoin de la variable i, car il existe une variable standard NR, qui fait cela. Donc on pourrait avoir

awk -v MAX=$MAX '{if (NF > 1 && NF < $MAX) print $0}' tout.dat > res$n.dat

(non testé).

Reply

Marsh Posté le 21-02-2009 à 13:47:53    

Merci pour ta réponse. J'ai testé split mais en fait ça ne fait pas vraiment ce que je veux :s
ce que je voudrais c'est que mon fichier soit découpé en x petits fichiers mais que les fichiers se superposent.
i.e. => n°1 = de la ligne 1 à 10
          n°2 = de la ligne 5 à 15
          n°3 = de la ligne 10 à 20
je ne m'exprinme pas bien :s  
en fait c'est le 1er champ de mon fichier (tableau) qui correspond au jour de l'année qui doit me servir de séparateur c'est pour ça que j'avai mis $1 dans ma ligne de awk, donc en fait:
         n°1 = du jour 1 au jour 10
         n°2 = du jour 5 au jour 15
...
apparement split n'a pas d'option pour ça,  
mais peut-etre avec un print tout simple (sans utiliser le awk) je test


Message édité par fanchois le 21-02-2009 à 14:02:57
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed