Comment extraire uniquement des valeurs supérieures à un seuil d'un fichier?


10

J'ai ce fichier:

names average
john:15.02
Mark:09.63
James:12.58

Je veux en extraire uniquement les moyennes supérieures à 10, donc la sortie dans cet exemple devrait être:

15.02
12.58

Réponses:


18

Avec awk

awk -F: '{if($2>10)print$2}' <filename

Explications

  • -F:- règle le Fséparateur de champ sur:
  • {if($2>10)print$2}- pour chaque ligne, tester si le 2nd est >10, si printc'est le cas
  • <filename- laisser le shell ouvrir le fichier filename, c'est mieux que de le awkfaire, voir la réponse de Stéphane Chazelas sur le sujet

Exemple d'exécution

$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58

Il est également possible d'ajouter des espaces et de mettre le motif en dehors des crochets, donc ceux-ci sont égaux - merci à Stefan de l' avoir souligné:

awk -F: '{if($2>10)print$2}' <filename
awk -F: '{ if ( $2 > 10 ) print $2 }' <filename
awk -F: '$2>10{print$2}' <filename
awk -F: '$2 > 10 { print $2 }' <filename

merci beaucoup pour votre aide, solution parfaite, puis-je utiliser uniquement les commandes 'couper' et 'grep' (commandes de base) dans cette situation pour afficher à partir de fichiers uniquement des moyennes supérieures à 10 ..
Haikel Fazzani

je comprends votre solution, parfait, merci beaucoup pour votre aide, j'apprécie tous vos efforts ..
Haikel Fazzani

N'oubliez pas que bash sera considéré [[ $0 > 10 ]]comme une comparaison lexicale - et en tout cas, n'aide pas beaucoup pour les valeurs non entières
steeldriver

@dessert: Personnellement, je préfère placer le modèle avant les instructions d'action, par exemple: awk -F: '$ 2> 10 {print $ 2}', car il me semble plus net et plus facile à étendre (par exemple, 2 $> 10 && $ 2 <100) .
Stefan

3

Avec grep, vous devrez travailler avec des expressions régulières; par exemple

grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2

comme avec sed:

sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file

Mais l'utilisation de RegEx sur les données commandées est sujette aux erreurs (d'après mon expérience) et difficile à lire ;-).


Très intelligent! Peut être raccourci en grep ':[1-9][0-9]\+\.' <file | cut -d: -f2et sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. Il convient de mentionner que cela ne fonctionne qu'avec> 1,> 10,> 100, etc., par exemple> 20 serait impossible.
dessert

J'ai trouvé un bogue dans mon RegEx: pour les nombres sans point décimal, le RegEx doit être: ':[1-9][0-9]\+\.\?'- le point décimal littéral \. est facultatif et correspond au plus une fois \ ?. (@dessert merci d'avoir signalé la restriction de mon RegEx.)
Stefan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.