Bash : Lire colonne .dat jusque...
Vigon
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour,
Cela fait deux bonnes heures que je galère pour un problème somme toute assez simple... J'essaie d'extraire des données (pour en calculer moyenne et variance) d'un fichier .dat donc la structure est comme suit:
De la 1ère à la n_ème ligne il y a des colonnes séparées par des tab et qui contiennent des nombres (parfois entiers, parfois float, parfois négatifs etc), et sur la fin du fichier une sorte de "petit résumé" qui commence par une ligne bien définie (Reactor stats:)
Je cherche donc à lire en shell (korn shell ou bash, peu importe les nuances)ces données. Voici ce que j'ai déjà écrit et qui ne marche qu'à moitié:
Cela fait deux bonnes heures que je galère pour un problème somme toute assez simple... J'essaie d'extraire des données (pour en calculer moyenne et variance) d'un fichier .dat donc la structure est comme suit:
De la 1ère à la n_ème ligne il y a des colonnes séparées par des tab et qui contiennent des nombres (parfois entiers, parfois float, parfois négatifs etc), et sur la fin du fichier une sorte de "petit résumé" qui commence par une ligne bien définie (Reactor stats:)
Je cherche donc à lire en shell (korn shell ou bash, peu importe les nuances)ces données. Voici ce que j'ai déjà écrit et qui ne marche qu'à moitié:
#!/bin/bash fichier=$1 colonne=$2 while read ligne do if [ grep Reactor $ligne!='' ] ;then echo $ligne | awk '{ print $'$colonne' }' else break fi done < $fichier
A voir également:
- Bash : Lire colonne .dat jusque...
- Bingo bash - Télécharger - Divers Jeux
- Bash list ✓ - Forum Shell
- Bash permission non accordée - Forum Shell
- Bash pause ✓ - Forum Shell
- Bash addition - Forum Programmation
11 réponses
Salut,
Edit :
Tu connais le numéro de champ et le séparateur, alors pourquoi pas tout simplement.
Edit :
Tu connais le numéro de champ et le séparateur, alors pourquoi pas tout simplement.
$ cat plop q1 50 q2 80 $ awk -F"\t" '{somme+=$2}END{ print somme}' plop 130
hello
tu veux extraire la colonne x de la ligne qui contient Reactor ?
tu veux extraire la colonne x de la ligne qui contient Reactor ?
$ cat a1 1 2 3 1 2 3 1 2 3 1 2 3 Reactor 4 5 6 $ head f1 #!/bin/bash fichier=$1 colonne=$2 awk '/Reactor/ {print $'"$colonne"'}' $1 $ ./f1 a1 3 5 $
Re,
Pour la moyenne par exemple
Pour la moyenne par exemple
$ awk -F"\t" '$0!~/^$/ {i+=1;somme+=$2}END{ print "somme = " somme ", moyenne = " somme/i}' plop somme = 130, moyenne = 65ou
$ awk -F"\t" '{somme+=$2}END{ print "somme = " somme ", moyenne = " somme/NF}' plop somme = 130, moyenne = 65
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
Attention à la syntaxe aussi !!!
Il faut des espaces de part et d'autre du signe égalitaire (ou non-égalitaire dans ton cas).
Ensuite la syntaxe de ta commande dans le test doit être entourée par "$(commande)"
La redirection de la variable doit être induite par <<< :
Attention à la syntaxe aussi !!!
if [ grep Reactor $ligne!='' ]
Il faut des espaces de part et d'autre du signe égalitaire (ou non-égalitaire dans ton cas).
Ensuite la syntaxe de ta commande dans le test doit être entourée par "$(commande)"
La redirection de la variable doit être induite par <<< :
if [ $(grep 'Reactor' <<< ${ligne})" != '' ]
@dubcek, non justement, les données qui sont situées au-dessus.
Merci lami, je vais regarder ça! Ca a une bonne tête ;).
Merci lami, je vais regarder ça! Ca a une bonne tête ;).
@lami : après test, ça ne marche pas vraiment... il ne s'arrête pas de lire à la ligne "reactor" et donc la moyenne est biaisée.
J'ai également oublié de stipuler que le remplissage de la colonne à lire ne commence pas toujours à la ligne 1.
Voici à quoi ressemble le fichier:
J'ai également oublié de stipuler que le remplissage de la colonne à lire ne commence pas toujours à la ligne 1.
Voici à quoi ressemble le fichier:
1 2 3 3241 -2 4 2384 4 5 8594 -5 6 2348 87 7 2938 3 Reactor stats: Axial balblalba Points: 63
Re,
Peut tous nous donner ton fichier ou une partie pour tester?
Edit:
Oups, je n'ai pas vu que tu as donnée un exemple ;-)
Peut tous nous donner ton fichier ou une partie pour tester?
Edit:
Oups, je n'ai pas vu que tu as donnée un exemple ;-)
Re,
Attention ton exemple a comme séparateur espace pas tabulation
Attention ton exemple a comme séparateur espace pas tabulation
$ cat plop 1 2 3 3241 -2 4 2384 4 5 8594 -5 6 2348 87 7 2938 3 Reactor stats: Axial balblalba Points: 63 $ awk 'FNR==1,/Reactor/{if($3)i+=1;somme+=$3}END{ print "somme = " somme ", moyenne = " somme/i}' plop somme = 87, moyenne = 17.4
Re,
J'ai repris ton exemple mais j'ai remplacé les espaces avec une tabulation
Dans ton fichier il y a une seule ligne qui contient Reactor ou plusieurs.
Puisque si c'est le cas alors il faut nous donner un exemple de fichier et si possible avec la bonne structure.
J'ai repris ton exemple mais j'ai remplacé les espaces avec une tabulation
Dans ton fichier il y a une seule ligne qui contient Reactor ou plusieurs.
Puisque si c'est le cas alors il faut nous donner un exemple de fichier et si possible avec la bonne structure.
$ cat -A plop 1^I$ 2^I$ 3^I3241^I-2$ 4^I2384^I4$ 5^I8594^I-5$ 6^I2348^I87$ 7^I2938^I3$ $ Reactor^Istats:^I$ ^IAxial^Ibalblalba$ ^IPoints:^I63$ $ $ cat plop 1 2 3 3241 -2 4 2384 4 5 8594 -5 6 2348 87 7 2938 3 Reactor stats: Axial balblalba Points: 63 $ awk -F"\t" 'FNR==1,/Reactor/{if($3)i+=1;somme+=$3}END{ print "somme = " somme ", moyenne = " somme/i}' plop somme = 87, moyenne = 17.4
Mon fichier contient bel et bien des tab et non des espaces, je ne savais juste pas comment les écrire dans la fenêtre.
Je ne peux pas vous donner le "vrai" fichier, simplement parce qu'il contient des données classifiées. (ce serait sans incidence mais la règle, c'est la règle :-) )
Je vais déjà essayer de me débrouiller avec tout ça. Merci pour votre aide.
Je ne peux pas vous donner le "vrai" fichier, simplement parce qu'il contient des données classifiées. (ce serait sans incidence mais la règle, c'est la règle :-) )
Je vais déjà essayer de me débrouiller avec tout ça. Merci pour votre aide.
Re,
Mon fichier contient bel et bien des tab et non des espaces, je ne savais juste pas comment les écrire dans la fenêtre.
Je le crois bien, je parlais de l'exemple ;-)
simplement parce qu'il contient des données classifiées.
Pas de problèmes, je comprends ;-)
Quand on essaie de trouver une solution sans avoir exactement les données en entrée c'est plus difficile.
Mon fichier contient bel et bien des tab et non des espaces, je ne savais juste pas comment les écrire dans la fenêtre.
Je le crois bien, je parlais de l'exemple ;-)
simplement parce qu'il contient des données classifiées.
Pas de problèmes, je comprends ;-)
Quand on essaie de trouver une solution sans avoir exactement les données en entrée c'est plus difficile.