Lire fichier txt ligne par ligne en bash

Résolu
jhoncoke Messages postés 44 Statut Membre -  
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
A voir également:

4 réponses

dubcek Messages postés 19021 Statut Contributeur 5 637
 
hello
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 
$ 
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

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 ;-(
0
jhoncoke Messages postés 44 Statut Membre
 
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.
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
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 
$  
0