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
Haikel Fazzani
la source

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
dessert
la source
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 ;-).

Stefan
la source
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