Script ksh pour extraire lignes particulieres d'un fichier txt [Résolu/Fermé]

Signaler
Messages postés
8
Date d'inscription
jeudi 21 février 2013
Statut
Membre
Dernière intervention
23 février 2013
-
Messages postés
8
Date d'inscription
jeudi 21 février 2013
Statut
Membre
Dernière intervention
23 février 2013
-
Bonjour,

Je suis chercheur en physique de l'atmosphère et je dispose de fichiers avec de milliers de lignes à traiter. Toutes ces données ne sont pas nécessaires donc j'aurais besoin de trier afin de ne traiter que les données qui m'intéressent.
Comme exemple réduit, je dispose d'un fichier "depart.txt" de 6 lignes et 11 colonnes sous ce format:

1 63.1493 -31.5184 163.59 163.01 231.82 244.82 237.46 228.75 226.33 224.79
2 63.8144 -29.6782 162.06 161.74 228.95 245.02 239.07 229.79 227.04 225.22
3 64.3665 -28.0338 161.56 162.72 228.13 245.73 239.69 230.53 227.31 225.28
4 64.8366 -26.5380 159.62 161.97 226.23 245.52 240.50 231.01 227.41 225.39
5 65.2450 -25.1572 160.67 162.72 224.81 245.23 241.52 231.24 227.64 225.72
6 65.6059 -23.8663 197.98 199.85 237.42 248.06 242.59 232.26 228.07 225.52

Le problème consiste à créer un autre fichier texte qui contiendra les lignes qui satisfont simultanément ces conditions :
- la valeur de la deuxième colonne est strictement inférieur à 64.000
- la valeur de la troisième colonne est strictement supérieur à -33.0000

Ainsi Je disposerais d'un fichier "reponse.txt" contenant ces données :
1 63.1493 -31.5184 163.59 163.01 231.82 244.82 237.46 228.75 226.33 224.79
2 63.8144 -29.6782 162.06 161.74 228.95 245.02 239.07 229.79 227.04 225.22
Je sollicite donc votre assistance pour disposer d'un script ksh permettant de le faire.
Je vous remercie d'avance.

5 réponses


salut,

en awk, ce sera plus efficace, plus beau, plus mieux

$ cat script.awk
#!/usr/bin/awk -f
($2 < 64.000 && $3 > -33.0000)
$ ./script.awk fichier.data
1 63.1493 -31.5184 163.59 163.01 231.82 244.82 237.46 228.75 226.33 224.79
2 63.8144 -29.6782 162.06 161.74 228.95 245.02 239.07 229.79 227.04 225.22


comme ça aussi
awk '($2 < 64.000 && $3 > -33.0000)' fichier.data
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 76687 internautes nous ont dit merci ce mois-ci

Messages postés
8
Date d'inscription
jeudi 21 février 2013
Statut
Membre
Dernière intervention
23 février 2013

Merci beaucoup qqchquicommenceparQ!!!
pourriez -vous m'ajouter une ligne qui permettrai de recuperer ces données dans un fichier .data au lieu de les affichers dans le shell?
Merci d'avance.
Messages postés
8
Date d'inscription
jeudi 21 février 2013
Statut
Membre
Dernière intervention
23 février 2013

Mis à jour
qqchquicommenceparQ

j'ai résolu la récupération des données dans un fichier .txt par :

awk '{($2 < 64.000 && $3 > -33.0000)}{print > f".txt"}' fic1.txt

En fait mon critère de sélection est que $2 soit dans l'intervalle [60,64]
et $3 soit dans l'intervalle [-33,-30]

j'ai essayé cette ligne de commande:

awk '{($2 == 60, $2 == 64 && $3 == -33, $3 == -30)}{print > f".txt"}' fic1.txt
il y erreur : awk: line 1: syntax error at or near }

MERCI d'avance!!!

awk '( (60.000<$2 && $2<64.000) && (-33.0000<$3 && $3<-30.0000) )' fichier.data > fichier.resultat
Messages postés
8
Date d'inscription
jeudi 21 février 2013
Statut
Membre
Dernière intervention
23 février 2013

Merci beaucoup qqchquicommenceparQ pour votre spontanéité.
cette ligne de commande crée un fichier.résultat vide!!!
Je crois que le awk n'est pas tout-à fait exécuter. Comment peut-on remédier?
Utilisateur anonyme
le fichier de données a-t-il changé ?

avec les données fournies, seule la première ligne est retenue.
Messages postés
8
Date d'inscription
jeudi 21 février 2013
Statut
Membre
Dernière intervention
23 février 2013

Non le fichier de données n'a pas changé,
les données fournies ne sont qu'une illustration de la structure du fichier.
Je travail sur un fichier de 23 490 lignes. je crois que c'est le awk qui n'est pas exécuté
car cette commande crée un fichier résultat vide.
Messages postés
8
Date d'inscription
jeudi 21 février 2013
Statut
Membre
Dernière intervention
23 février 2013

Pour étayer mon argumentaire
En exécutant ce code :
awk '($2 < 64.000 && $3 > -33.0000)' fic.txt > f1.txt
je dispose à la fin de f1.txt avec les données sélectionnées, soit 16 494 lignes sur 23 490.
Messages postés
35828
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 novembre 2020
5 680
Salut,

Et donc ? Où est le souci ? Ce n'est pas ce que tu veux ?
Messages postés
8
Date d'inscription
jeudi 21 février 2013
Statut
Membre
Dernière intervention
23 février 2013

Merci qqchquicommenceparQ !!!

zipe31 le souci était que pour ce code :
awk '( (60.000<$2 && $2<64.000) && (-33.0000<$3 && $3<-30.0000) )' fic.data > fic.resultat
je trouve un fichier résultat vide.

Je viens de comprendre le pourquoi, car aucune ligne ne satisfait ces conditions.
Merci qqchquicommenceparQ et zipe31 !!!