Lire fichier txt ligne par ligne en bash

Résolu/Fermé
jhoncoke Messages postés 35 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 4 octobre 2012 - 8 oct. 2010 à 10:37
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 - 8 oct. 2010 à 14:35
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
8 oct. 2010 à 12:09
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 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
8 oct. 2010 à 12:37
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 35 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 4 octobre 2012
8 oct. 2010 à 13:40
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
Modifié par dubcek le 8/10/2010 à 14:35
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