Lire fichier txt ligne par ligne en bash
Résolu
jhoncoke
Messages postés
44
Statut
Membre
-
dubcek Messages postés 19021 Statut Contributeur -
dubcek Messages postés 19021 Statut Contributeur -
Bonjour,
J'ai un fichier txt contenant 4 colonnes de nombres réels. Je voudrais lire le fichier ligne par ligne et mettre les données dans un nouveau fichier à chaque fois que la 4ème colonne est nulle avec un script bash ou shell (ou autre). Voici un bout de mon fichier:
0.000000 0.000000 0.000000<== 1ere ligne du fichier=> pas d'action!
0.023367 0.000000 6.200000
0.003548 0.000000 6.300000
0.011333 0.000000 6.400000
0.005677 138.900000 3.100000
1.067020 138.800000 0.000000 <==4ème colonne nulle: mettre toutes les lignes précédentes y compris celle-là dans un nouveau fichier.
0.137370 0.000000 0.000000 <== 0 précédé d'un 0 donc pas d'action!
0.007805 104.800000 10.300000
0.002838 104.400000 13.500000
0.011334 104.800000 14.500000
Merci
J'ai un fichier txt contenant 4 colonnes de nombres réels. Je voudrais lire le fichier ligne par ligne et mettre les données dans un nouveau fichier à chaque fois que la 4ème colonne est nulle avec un script bash ou shell (ou autre). Voici un bout de mon fichier:
0.000000 0.000000 0.000000<== 1ere ligne du fichier=> pas d'action!
0.023367 0.000000 6.200000
0.003548 0.000000 6.300000
0.011333 0.000000 6.400000
0.005677 138.900000 3.100000
1.067020 138.800000 0.000000 <==4ème colonne nulle: mettre toutes les lignes précédentes y compris celle-là dans un nouveau fichier.
0.137370 0.000000 0.000000 <== 0 précédé d'un 0 donc pas d'action!
0.007805 104.800000 10.300000
0.002838 104.400000 13.500000
0.011334 104.800000 14.500000
Merci
A voir également:
- Bash lire fichier ligne par ligne
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire fichier epub - Guide
- Partager photos en ligne - Guide
- Fichier bin - Guide
- Mètre en ligne - Guide
4 réponses
hello
faut-il traiter le reste du fichier ou s'arrêter à la ligne 6 ?
faut-il traiter le reste du fichier ou s'arrêter à la ligne 6 ?
$ awk '{x[NR]=$0;y[NR]=$3};END{i=1;for(n=1;n<=NR;n++){if(n!=1 && !y[n] && y[n-1])for(;i<=n;i++) print x[i] > "a11" }}' fichier
$
$ cat a11
0.000000 0.000000 0.000000
0.023367 0.000000 6.200000
0.003548 0.000000 6.300000
0.011333 0.000000 6.400000
0.005677 138.900000 3.100000
1.067020 138.800000 0.000000
$
Salut,
S'il ne faut traiter que les 1er cas rencontré, avec "sed" :
S'il y a d'autres cas similaires dans le fichier à traiter ça ne le fera pas, le seul souci est au niveau de la génération d'un fichier de sortie différent ;-(
S'il ne faut traiter que les 1er cas rencontré, avec "sed" :
$ cat plop 0.000000 0.000000 0.000000 0.023367 0.000000 6.200000 0.003548 0.000000 6.300000 0.011333 0.000000 6.400000 0.005677 138.900000 3.100000 1.067020 138.800000 0.000000 0.137370 0.000000 0.000000 0.007805 104.800000 10.300000 0.002838 104.400000 13.500000 0.011334 104.800000 14.500000 $ sed -n ':z;N;/ 0\.00*$/! bz; w toto' plop $ cat toto 0.000000 0.000000 0.000000 0.023367 0.000000 6.200000 0.003548 0.000000 6.300000 0.011333 0.000000 6.400000 0.005677 138.900000 3.100000 1.067020 138.800000 0.000000 $
S'il y a d'autres cas similaires dans le fichier à traiter ça ne le fera pas, le seul souci est au niveau de la génération d'un fichier de sortie différent ;-(
Il faut traiter tout le fichier... Et il existe beaucoup de cas similaires. Je m'attends à avoir entre 20 et 30 fichiers différents à la fin...
Maintenant je peux reposer le problème autrement:
Au lieu de mettre les données dans un nouveau fichier, je peux directement dessiner un diagramme avec un gnuplot... D'ailleur, le but final de toute l'opération est de tracer des diagrammes différents avec ces parties du fichier.
Maintenant je peux reposer le problème autrement:
Au lieu de mettre les données dans un nouveau fichier, je peux directement dessiner un diagramme avec un gnuplot... D'ailleur, le but final de toute l'opération est de tracer des diagrammes différents avec ces parties du fichier.
a tester sur plus de données
$ awk '{x[NR]=$0;y[NR]=$3};END{i=1;for(n=1;n<=NR;n++){if(n==1 || (n!=1 && y[n]) || (!y[n] && y[n-1])) print x[n] > "result" i; else i++}}' fichier
$ more result*
::::::::::::::
result1
::::::::::::::
0.000000 0.000000 0.000000
0.023367 0.000000 6.200000
0.003548 0.000000 6.300000
0.011333 0.000000 6.400000
0.005677 138.900000 3.100000
1.067020 138.800000 0.000000
::::::::::::::
result2
::::::::::::::
0.007805 104.800000 10.300000
0.002838 104.400000 13.500000
0.011334 104.800000 14.500000
$