Copier 100 lignes d un fichier
Résolu
CYG
-
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
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:
- Copier 100 lignes d un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
26 réponses
Salut,
lami20j@debian:~/trash$ cat cyg2.pl
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.17Le 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
ç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
merci d avance,
CYG
Ben tout dépend du programme devant réceptionner les valeurs (formatage en sortie).
Sinon, une simple redirection dans un fichier texte :
Sinon, une simple redirection dans un fichier texte :
sed -n '105,+100 w fichier_sortie' fichier_entrée;-))
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
donc si vous avez une idée sur une idée, je vous serai vraiment reconnaissant
merci d avance,
CYG
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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
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
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 ??
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 ??
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 :
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 > fichierEt 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,7371Bon courage ;-))
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
... 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
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 ? ;-)
En plus comme notre ami "CYG" bosse sur du cygwin, et s'il faut compiler, autant oublié, non ? ;-)
"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 ?
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 ?
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à ;-))
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à ;-))
Salut,
pour recuperer les lignes de 105 + 100
pour recuperer les lignes de 105 + 100
find /repertoire -name 'fichier*.txt' -exec perl -ne 'print if 105 .. 205' {} \; > resultatmais je pense que je peux faire tout d'un coup, récupération et les calculs
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)
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
Euh... moi y'a un truc qui me chiffonne, c'est ça :
moyenne colonne 4 = 0.61J'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.42J'ai bon ou pas ?
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) :
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;-))
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
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
Re-
Il faut créer un fichier nommé "script.awk" (ou comme tu veux) et y mettre ça dedans :
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;-))
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...
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...
merci bcp, ça marche nikel,je veux juste savoir comment appliqué les modifications directement sur le fichier, puisque le résultat est bon.
CYG