Copier 100 lignes d un fichier

Résolu
CYG -  
 CYG -
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
A voir également:

26 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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

1
CYG
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,
sed -n '105,+100 p' fichier
;-))
0
CYG
 
ç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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
;-))
0
CYG
 
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
0
CYG > CYG
 
alors les amis vous avez pas de suggestions, la je suis vraiment bloqué, je peux rien faire.

merci d avance

CYG
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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.
0
CYG
 
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
0
bob031 Messages postés 8158 Date d'inscription   Statut Membre Dernière intervention   473
 
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 ??
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut bobby,

Oui c'est exact et c'est bien ce que j'avais compris ;-\

Merci pour la soutiendance ;-))
0
bob031 Messages postés 8158 Date d'inscription   Statut Membre Dernière intervention   473 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
 
hello,

Merci pour la soutiendance

je soutiens ! je soutiens ! :-)

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

:-))
0
CYG > bob031 Messages postés 8158 Date d'inscription   Statut Membre Dernière intervention  
 
mais les valeurs changent d un fichier à un autre

merci d avance

CYG
0
CYG > bob031 Messages postés 8158 Date d'inscription   Statut Membre Dernière intervention  
 
salut,

oui, c est ça

merci d avance

CYG
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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 :
https://www.grymoire.com/Unix/Awk.html
http://www.salemioche.net/gawk.php
https://pubs.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 ;-))
0
CYG
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896 > CYG
 
http://www.shellunix.com/awk.html

C'est tout ce que j'ai en français et c'est maigre en plus ;-(
0
bob031 Messages postés 8158 Date d'inscription   Statut Membre Dernière intervention   473
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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 ? ;-)
0
bob031 Messages postés 8158 Date d'inscription   Statut Membre Dernière intervention   473
 
"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 ?
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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 là ;-))
0
CYG > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
 
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
0
bob031 Messages postés 8158 Date d'inscription   Statut Membre Dernière intervention   473 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
 
blagueur, va !

:-))
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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


0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
0
CYG
 
pour la récuperation c est bon, pour le calcul?????

j attends tjs

merci d avance
CYG
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
je vais voir ça plus tard
je suis encore au boulot
0
bob031 Messages postés 8158 Date d'inscription   Statut Membre Dernière intervention   473
 
hello,

go ! go !

:-))
0
CYG
 
prends votre temps;

merci d avance

CYG
0
CYG
 
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
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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

0
CYG
 
salut,

pour la moyenne c est bon, et pour l écart type??? sqrt((($c4-moyenne)^2)/nb de ligne)??????

merci d avance????

CYG
0
CYG
 
pour calculer l écart type, il faut que je récupére la moyenne de la premiére boucle et j ouvre une autre boucle
<$ecart += (($tmp[4] - moyenne 4)^2)> et aprés j aurais l <ecart type = $ecart/$1>

alors vous avez une idée comment je vais faire ça avec perl

merci d avance

CYG
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Euh... moi y'a un truc qui me chiffonne, c'est ça :
moyenne colonne 4 = 0.61
J'ai beau trituré ça dans tous les sens, j'arrive pas à ce résultat ;-((
  180.88
+ 180.62
+ 149.66
+ 180.62
+ 118.56
+ 173.00
+ 149.59
+ 149.75
+ 157.84
+ 134.97
+ 149.50
+ 137.22
+ 179.19
+ 149.38
+ 153.91
+ 125.97
----------------
   2470.66

2470.66 / 16 = 154.42
J'ai bon ou pas ?
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
 
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
;-))
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
bien sûr que j'ai des idées ;-)
je vais regarder ce soir
0
CYG
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
;-))
0
CYG
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Affiche ton fichier à traiter avec la commande suivante :
cat -A fichier_a_traiter
;-)
0
CYG
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Bon alors que renvoie la commande :
sed -n '$=' fichier_a_traiter
???
0
CYG
 
elle renvoie <17>

merci d avance

CYG
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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...
0
CYG
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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)
0
CYG
 
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
0