Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1170 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  apprentissage du bash

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

apprentissage du bash

n°1851669
fanchois
Posté le 16-02-2009 à 11:48:32  profilanswer
 

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 ;)

mood
Publicité
Posté le 16-02-2009 à 11:48:32  profilanswer
 

n°1851670
dwogsi
Défaillance cérébrale...
Posté le 16-02-2009 à 11:54:09  profilanswer
 

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})/
n°1851675
fanchois
Posté le 16-02-2009 à 12:09:10  profilanswer
 

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
n°1851683
Taz
bisounours-codeur
Posté le 16-02-2009 à 12:27:32  profilanswer
 

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

n°1851789
matafan
Posté le 16-02-2009 à 16:22:46  profilanswer
 

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

n°1852497
fanchois
Posté le 18-02-2009 à 11:31:32  profilanswer
 

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
n°1852528
olivthill
Posté le 18-02-2009 à 12:51:37  profilanswer
 

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é).

n°1853755
fanchois
Posté le 21-02-2009 à 13:47:53  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  apprentissage du bash

 

Sujets relatifs
[Bash/KSH] Ajouter une colonne dans un fichier...comment bien gérer les parametres de fonctions en bash ?
[Bash Linux] compter dans un fichier[Bash Linux] nombre d'un caractère choisi
[Shell/Bash] Compter nombre de fichiers dans un répertoireScript bash - Problème d'espace dans une variable RESOLU
Script bash; fork: Ne peut allouer de la mémoire[bash] Détection d'un /dev CD/DVD
ecrire un script shell avec bashApprentissage du slovène au travers d'une IHM tactile
Plus de sujets relatifs à : apprentissage du bash


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR