Posez votre question Signaler

Copier 100 lignes d un fichier [Résolu]

CYG - Dernière réponse le 11 mars 2008 à 12:22
Bonjour,
j ai un fichier qui contient un trés grand nombre de lignes, mon objectif c'est de copier 100 lignes à partir de la ligne numéro 105(ligne soulignée), et les mettre dans un tableau pour effectuer des calculs sur les colonnes.
voici un extrai de mon fichier:
<
.
.
.
Peak search ovs window (l,p): 16 , 16
Oversampling factor: 32
Number_of_correlation_windows: 100
Number posL posP offsetL offsetP correlation
0 8452 2842 390.00 -2.62 0.16
1 8452 3133 332.94 36.75 0.15
2 8452 3425 370.31 26.56 0.12
3 8452 3716 375.16 38.09 0.13
4 8751 2939 390.97 15.22 0.14
5 8751 3230 389.44 8.16 0.18
6 8751 3522 355.34 40.38 0.09
7 8751 3813 360.94 8.81 0.19
8 9051 3036 361.91 9.31 0.24
9 9051 3327 346.34 -20.34 0.16
10 9051 3619 347.28 31.03 0.13
11 9350 2842 362.06 8.88 0.29
12 9350 3133 360.81 8.31 0.14
13 9350 3424 332.69 -22.91 0.14
14 9350 3716 347.25 -20.75 0.15
15 9650 2939 361.69 9.06 0.47
16 9650 3230 361.62 8.59 0.34
.
.
.>
guelqu'un peut m aider???
merci d avance;
CYG
Lire la suite 

Copier 100 lignes d un fichier »

58 réponses
Réponse
+1
moins plus
Salut,

lami20j@debian:~/trash$ cat cyg2.pl
#!/usr/bin/perl
use strict;use warnings;

my($c3,$c4,$m4,$m5,$n,$e1,$e2);

open F,"fic" or die "E/S : $!\n";
while(<F>){
        next if /^\s*$/;
        my @col=(split /\s+/,$_)[3,4];
        $c3+=$col[0];
        $c4+=$col[1];

        ++$n;
}
$m4=$c3/$n;
$m5=$c4/$n;
$e1=sqrt((($c3-$m4)^2) / $n);
$e2=sqrt((($c4-$m5)^2) / $n);

printf "\t\t%s\t\t%s\t\t%s\n"," Total","Moyenne","Ecart type";
printf "Colonne 4 :\t% .2f\t% .2f\t\t% .2f\n",$c3,$m4,$e1;
printf "Colonne 5 :\t% 8.2f\t% .2f\t\t% .2f\n\n",$c4,$m5,$e2;
close F;

open F,"fic" or die "E/S : $!\n";
while(<F>){
   my @col=(split /\s+/,$_)[3,4];
   s/(.*)\s+\d.*/$1 0.1/ if (abs($col[0] - $m4) < $e1)
                            ||
                            (abs($col[1] - $m5) < $e2);
   print;
}

close F;
__END__
lami20j@debian:~/trash$
Le fichier
lami20j@debian:~/trash$ cat fic
0 8452 2844 180.88 22.81 0.09
1 8452 3137 180.62 2.28 0.14
2 8452 3430 149.66 -1.84 0.30
3 8452 3724 180.62 -28.81 0.15
4 8760 2942 118.56 -18.09 0.12
5 8760 3235 173.00 28.62 0.12
6 8760 3528 149.59 -1.97 0.17
7 8760 3821 149.75 -1.88 0.44
8 9067 3039 157.84 2.12 0.18
9 9067 3333 134.97 -5.31 0.17
10 9067 3626 149.50 -1.75 0.48
11 9375 2844 137.22 -0.03 0.13
12 9375 3137 179.19 9.19 0.14
13 9375 3430 149.38 -1.91 0.47
14 9375 3723 153.91 -19.97 0.10
15 9682 2942 125.97 26.34 0.17
Le test
lami20j@debian:~/trash$ perl cyg2.pl
                 Total          Moyenne         Ecart type
Colonne 4 :      2470.66         154.42          12.04
Colonne 5 :         9.80         0.61            0.83

0 8452 2844 180.88 22.81 0.09
1 8452 3137 180.62 2.28 0.14
2 8452 3430 149.66 -1.84 0.1
3 8452 3724 180.62 -28.81 0.15
4 8760 2942 118.56 -18.09 0.12
5 8760 3235 173.00 28.62 0.12
6 8760 3528 149.59 -1.97 0.1
7 8760 3821 149.75 -1.88 0.1
8 9067 3039 157.84 2.12 0.1
9 9067 3333 134.97 -5.31 0.17
10 9067 3626 149.50 -1.75 0.1
11 9375 2844 137.22 -0.03 0.1
12 9375 3137 179.19 9.19 0.14
13 9375 3430 149.38 -1.91 0.1
14 9375 3723 153.91 -19.97 0.1
15 9682 2942 125.97 26.34 0.17

CYG - 11 mars 2008 à 10:28
salut;

merci bcp, ça marche nikel,je veux juste savoir comment appliqué les modifications directement sur le fichier, puisque le résultat est bon.

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Salut,
sed -n '105,+100 p' fichier
;-))
Ajouter un commentaire
Réponse
+0
moins plus
ça marche pour les affichées, et pour les coller dans un tableau pour faire des calculs mathématiques sur les colonnes, vous avez une idée?????

merci d avance,
CYG
Ajouter un commentaire
Réponse
+0
moins plus
Ben tout dépend du programme devant réceptionner les valeurs (formatage en sortie).

Sinon, une simple redirection dans un fichier texte :
sed -n '105,+100 w fichier_sortie' fichier_entrée
;-))
CYG - 6 mars 2008 à 13:38
merci cette fois ça marche, mais le probléme c est que je veux exploiter le<fichier_sortie> sous forme d un tableau pour effectuer aprés des calculs sur les colonnes(mais je sais pas comment faire puisque j'aurai une centaine de <fichier_sortie> dans des sous réperoires différents), je veux bien réaliser cette tache tjs sous cygwin.

donc si vous avez une idée sur une idée, je vous serai vraiment reconnaissant


merci d avance,

CYG
CYG - 6 mars 2008 à 14:49
alors les amis vous avez pas de suggestions, la je suis vraiment bloqué, je peux rien faire.

merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Expliques-nous exactement (avec des exemples concrets) ce que tu veux en sortie par rapport à ton exemple initial !!!

Tu veux le résultat dans un fichier avec la somme de chaque colonne en bas ? La somme que de certaines colonnes ? Le tout dans le même fichier ? etc.
CYG - 6 mars 2008 à 16:22
je vais vous expliquer ce que je veux en détail
dans un fichier <com.txt>: voici une partie de ce fichier
0 8452 2844 180.88 22.81 0.09
1 8452 3137 180.62 2.28 0.14
2 8452 3430 149.66 -1.84 0.30
3 8452 3724 180.62 -28.81 0.15
4 8760 2942 118.56 -18.09 0.12
5 8760 3235 173.00 28.62 0.12
6 8760 3528 149.59 -1.97 0.17
7 8760 3821 149.75 -1.88 0.44
8 9067 3039 157.84 2.12 0.18
9 9067 3333 134.97 -5.31 0.17
10 9067 3626 149.50 -1.75 0.48
11 9375 2844 137.22 -0.03 0.13
12 9375 3137 179.19 9.19 0.14
13 9375 3430 149.38 -1.91 0.47
14 9375 3723 153.91 -19.97 0.10
15 9682 2942 125.97 26.34 0.17

je veux calculer la moyenne pour la 4éme colonne <M4> et la moyenne pour la 5éme colonne <M5>, aprés calculer l'écart type pour la 4éme et la 5 éme colonne(dont la formule est< racine(1/99(somme((val4-M4)^2)))> avec val4: valeur de la colonne 4); puis faire le test suivant pour ttes les valeurs de la colonne < si valeur absolu(val4 - M4) < écart type pour 4éme ligne ; affecter à la valeur de la 6éme colonne <0.01>;
par exemple:

pour la ligne 6 8760 3528 149.59 -1.97 0.17 le test est vérifié dans la ligne devient

6 8760 3528 149.59 -1.97 0.01

j espére que c est bien expliqué maintenet


merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

Si on a bien compris il y a plusieurs fichiers disséminés dans plusieurs répertoires et avec la même structure : celle-ci :

0 8452 2842 390.00 -2.62 0.16
1 8452 3133 332.94 36.75 0.15
2 8452 3425 370.31 26.56 0.12
3 8452 3716 375.16 38.09 0.13
4 8751 2939 390.97 15.22 0.14
5 8751 3230 389.44 8.16 0.18
6 8751 3522 355.34 40.38 0.09
7 8751 3813 360.94 8.81 0.19

et le but du jeu est pour chaque fichier de récupérer certaines lignes et les coller dans un fichier sortie (qui aura la même structure ????? celle-ci ???? :
0 8452 2842 390.00 -2.62 0.16
1 8452 3133 332.94 36.75 0.15
2 8452 3425 370.31 26.56 0.12

et à partir de ce fichier sortie : faire des calculs sur les données récupérées.


exact ??
bob031- 6 mars 2008 à 16:15
hello,

Merci pour la soutiendance

je soutiens ! je soutiens ! :-)

soutiendance ??? tiens ! tu m'en copieras 100 lignes stp ! :-)

:-))
CYG - 6 mars 2008 à 16:25
mais les valeurs changent d un fichier à un autre

merci d avance

CYG
CYGbob031 - 6 mars 2008 à 16:28
salut,

oui, c est ça

merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Re-

Bon à mon avis l'outil dont tu as besoin c'est "awk" (Perl aussi devrait faire l'affaire, mais je connais pas du tout).

Donc pour commencer, des liens :
http://www.grymoire.com/Unix/Awk.html
http://www.salemioche.net/gawk.php
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
http://www.student.northpark.edu/pemente/awk/awk1line.txt

Et un aperçu des possibilités en prenant comme exemple le fichier cité plus haut et sa sortie générée par "sed" (au passage il faut transformer le séparateur décimal (le point) par une virgule), ce qui nous donne par rapport à la syntaxe du post #3 :
sed -n '105,+100 s/\./,/gp' fichier.txt > fichier
Et ensuite sur le fichier obtenu appliqué le filtre awk, pour par exemple obtenir le total de la colonne 4 et sa moyenne :
awk '{ sum +=$5; moy = (sum / NR) } END { printf "Total :% g \nMoyenne :% g \n",sum,moy }' fichier
Total : 182,53
Moyenne : 10,7371
Bon courage ;-))
CYG - 6 mars 2008 à 17:38
merci pour l aide, mais je suis vraiment perdu et en plus niveau english pas fort, vous connaissez pas un site en français et pour les débutants, ça sera trés sympa de votre part

merci d avance

CYG
jipicy- 6 mars 2008 à 17:49
http://www.shellunix.com/awk.html

C'est tout ce que j'ai en français et c'est maigre en plus ;-(
Ajouter un commentaire
Réponse
+0
moins plus
ouaips !

... et numsum alors ? il semble presque parfait pour ce genre de "petit" travail !

à titre indicatif :
le paquetage de num-utils c'est ici : http://suso.suso.org/programs/num-utils/
le manpage ici : http://suso.suso.org/programs/num-utils/man1/numsum.html
Ajouter un commentaire
Réponse
+0
moins plus
J'avions vu, mais impossible de mettre la main sur le paquet (utils...) sur Mandriva.

En plus comme notre ami "CYG" bosse sur du cygwin, et s'il faut compiler, autant oublié, non ? ;-)
Ajouter un commentaire
Réponse
+0
moins plus
"impossible de mettre la main sur le paquet (utils...) sur Mandriva."
pourtant je l'avais installé sur la mandriva (j'avais retrouvé le lien, voir post<3> : http://www.commentcamarche.net/forum/affich 4060658 aide script tres simple

peut-être l'ai-je installé en tar.gz ....me souviens plus (c'est bien loin tout ça : 16 novembre 2007).


"En plus comme notre ami "CYG" bosse sur du cygwin,"

comme je ne connais pas, je ne sais pas ce qu'on peut faire avec ...donc ! :-)

:-))

ps : je vois plus le mode italique depuis un certain temps, c'est normal ou est-ce mon navigateur ...voir moi ?
jipicy- 6 mars 2008 à 17:44
peut-être l'ai-je installé en tar.gz ....me souviens plus (c'est bien loin tout ça : 16 novembre 2007)
Et la molette de la souris est coincée ??? pffffffffffffffffffffff ;-DD

comme je ne connais pas, je ne sais pas ce qu'on peut faire avec ...donc ! :-)
Cygwin ;-((

ps : je vois plus le mode italique depuis un certain temps, c'est normal ou est-ce mon navigateur ...voir moi ?
C'est toi ;-))
Non, regarde ;-))
CYG - 6 mars 2008 à 18:03
merci, c est ce que j ai trouvé moi aussi, ça explique pas ce que je veux;

vraiment je pige rien sur gawk ou awk; ça me déprime,,,,

je sais pas comment transformé les données dans mon fichier en tableau

CYG
bob031jipicy - 6 mars 2008 à 18:05
blagueur, va !

:-))
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

pour recuperer les lignes de 105 + 100
find /repertoire -name 'fichier*.txt' -exec perl -ne 'print if 105 .. 205' {} \; > resultat
mais je pense que je peux faire tout d'un coup, récupération et les calculs


jipicy- 6 mars 2008 à 18:04
Salut,

Enfin ! Il était temps que tu te pointes ;-\

J'ai horreur des maths ;-((( (désolé professeur lami20j)

Bon t'as 10 minutes, montres en main......... top chrono ! ;-DDD
CYG - 6 mars 2008 à 18:23
pour la récuperation c est bon, pour le calcul?????

j attends tjs

merci d avance
CYG
Ajouter un commentaire
Réponse
+0
moins plus
je vais voir ça plus tard
je suis encore au boulot
bob031- 6 mars 2008 à 18:19
hello,

go ! go !

:-))
CYG - 6 mars 2008 à 18:25
prends votre temps;

merci d avance

CYG
CYG - 7 mars 2008 à 09:31
bonjour,

alors Mr <lami20j> vous avez une suggestion, une idée qui peut m aider pour résoudre mon probléme. Je vous serais vraiment reconnaissant si vous me trouviez une piste ou une solution.

merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

par exemple pour calculer la moyenne pour les colonnes 4 et 5 (j'ai pris la 1ère colonne comme numéro de ligne)
root@debian:~/trash# cat fic
0 8452 2844 180.88 22.81 0.09
1 8452 3137 180.62 2.28 0.14
2 8452 3430 149.66 -1.84 0.30
3 8452 3724 180.62 -28.81 0.15
4 8760 2942 118.56 -18.09 0.12
5 8760 3235 173.00 28.62 0.12
6 8760 3528 149.59 -1.97 0.17
7 8760 3821 149.75 -1.88 0.44
8 9067 3039 157.84 2.12 0.18
9 9067 3333 134.97 -5.31 0.17
10 9067 3626 149.50 -1.75 0.48
11 9375 2844 137.22 -0.03 0.13
12 9375 3137 179.19 9.19 0.14
13 9375 3430 149.38 -1.91 0.47
14 9375 3723 153.91 -19.97 0.10
15 9682 2942 125.97 26.34 0.17
root@debian:~/trash# cat cyg.pl
#!/usr/bin/perl
use strict; use warnings;

open F,"fic"
  or die "E/S : $!\n";

my ($c4,$c5,$l);
while(<F>){
  my @tmp=split /\s+/,$_;
  $c4 += $tmp[4];
  $c5 += $tmp[5];
  $l = $.;
}
printf "moyenne colonne 4 = %.2f\n",$c4 / $l;
printf "moyenne colonne 5 = %.2f\n",$c5 / $l;
__END__
root@debian:~/trash# perl cyg.pl
moyenne colonne 4 = 0.61
moyenne colonne 5 = 0.21

lami20j- 7 mars 2008 à 14:54
salut,

c'est normal, je n'ai pas pris en compte la 1ère colonne

(j'ai pris la 1ère colonne comme numéro de ligne)
22,81
2,28
-1,84
-28,81
-18,09
28,62
-1,97
-1,88
2,12
-5,31
-1,75
-0,03
9,19
-1,91
-19,97
26,34
------------------
0,6125
jipicyjipicy - 7 mars 2008 à 14:59
Tu me rassures :-))

Alors voilà une solution avec "awk". Par contre il faut impérativement transformer le symbole décimal (le point) par une virgule, avec "sed" ça va tout seul (sed -i 's/\./,/g' fichier) :
[cyg]$ cat script.awk
{
sum1 +=$4; moy1 = (sum1 / NR)
sum2 +=$5; moy2 = (sum2 / NR)
}
{
ecart1 = (sqrt(((sum1-moy1)^2)/NR))
ecart2 = (sqrt(((sum2-moy2)^2)/NR))
}

END {
printf "\t\t%s\t\t%s\t\t%s\n"," Total","Moyenne","Ecart type"
printf "Colonne 4 :\t% .2f\t% .2f\t\t% .2f\n",sum1,moy1,ecart1
printf "Colonne 5 :\t% 8.2f\t% .2f\t\t% .2f\n",sum2,moy2,ecart2
}

[cyg]$ awk -f script.awk fichier
                 Total          Moyenne         Ecart type
Colonne 4 :      2470,66         154,42          579,06
Colonne 5 :         9,80         0,61            2,30
;-))
lami20j- 7 mars 2008 à 15:15
c'est parfait, ça m'evite pour encore une fois de travailler ;-)
en plus je n'ai pas du temps en ce moment

;-))
Ajouter un commentaire
Réponse
+0
moins plus
bien sûr que j'ai des idées ;-)
je vais regarder ce soir
Ajouter un commentaire
Réponse
+0
moins plus
merci jipicy;
mais j ai petit probléme quand j introduit ton script dans la fenêtre de cygwin


<cat script.awk {sum1 +=$4; moy1 =(sum1/NR) \n sum2 +=$5; moy2 =(sum2/NR)}{ecart1 = (sqrt(((sum1-moy1)^2)/NR)) \n ecart2 =(sqrt(((sum2-moy2)^2)/NR))} END {printf "\t\t%s\t\t%s\t\t%s\n","total","Moyenne","Ecart type" \n printf "col4:\t% .2f\t% .2f\t\t% .2f\n",sum1,moy1,ecart1 \n printf "col5:\t% 8.2f\t% .2f\t\t% .2f\n",sum2,moy2,ecart2}>

bash: syntax error near unexpected token '('


merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Re-

Il faut créer un fichier nommé "script.awk" (ou comme tu veux) et y mettre ça dedans :
{
sum1 +=$4; moy1 = (sum1 / NR)
sum2 +=$5; moy2 = (sum2 / NR)
}
{
ecart1 = (sqrt(((sum1-moy1)^2)/NR))
ecart2 = (sqrt(((sum2-moy2)^2)/NR))
}

END {
printf "\t\t%s\t\t%s\t\t%s\n"," Total","Moyenne","Ecart type"
printf "Colonne 4 :\t% .2f\t% .2f\t\t% .2f\n",sum1,moy1,ecart1
printf "Colonne 5 :\t% 8.2f\t% .2f\t\t% .2f\n",sum2,moy2,ecart2
}
Puis appelé le script de cette façon :
awk -f script.awk fichier_&_traiter
;-))
CYG - 7 mars 2008 à 17:44
merci jipicy, mais j ai un tout petit probléme lpour la moyenne il divise la somme par 17 au lieu de 16 <NR = 17>, vous savez pourqoui??

merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Affiche ton fichier à traiter avec la commande suivante :
cat -A fichier_a_traiter
;-)
CYG - 7 mars 2008 à 17:55
j ai 16 lignes de 0 a 15, est ce que vous pouvez me montrer comment copier ce qui m affiche cygwin et le copier ici, ça sera plus facile;

merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Bon alors que renvoie la commande :
sed -n '$=' fichier_a_traiter
???
CYG - 7 mars 2008 à 18:03
elle renvoie <17>

merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Ben c'est que tu as 17 lignes dans ton fichier ;-((

Tu dois avoir une ligne vide en fin de fichier, c'est pour ça qu'il serait bien de pouvoir copier/coller le résultat de la commande "cat -A fichier" ici même entre les balises :

< code > et < /code >

sans les espaces entre les chevrons pour voir les caractères non-imprimable de ton fichier...
CYG - 7 mars 2008 à 18:20
dsl pour ma question qui est ....., que dois je faire pour copier/coller le résultat de la commande à aprtir de cygwin et les mettre entre <>

merci d avance

CYG
Ajouter un commentaire
Réponse
+0
moins plus
Ben tu surlignes avec la souris le résultat de la commande "cat -A fichier", tu fais un :

=> clic-droit => copier (ou CTRL C au clavier)
tu viens ensuite ici, puis :
=> clic-droit => coller (ou CTRL V au clavier)
CYG - 7 mars 2008 à 18:30
mais le probléme ca se pose pas dans copier et coller, mais comment je vais souligné le résultat, car dans la fenétre de cygwin, je peux pas utilisé la souris, ça marche pas???

merci d avance
CYG
Ajouter un commentaire
Ce document intitulé « copier 100 lignes d un fichier » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?
copier 100 lignes d un fichier - page 2