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
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:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
- règle le F
séparateur de champ sur:
{if($2>10)print$2}
- pour chaque ligne, tester si le 2
nd est >10
, si print
c'est le cas<filename
- laisser le shell ouvrir le fichier filename
, c'est mieux que de le awk
faire, voir la réponse de Stéphane Chazelas sur le sujet$ <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
[[ $0 > 10 ]]
comme une comparaison lexicale - et en tout cas, n'aide pas beaucoup pour les valeurs non entières
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 ;-).
grep ':[1-9][0-9]\+\.' <file | cut -d: -f2
et 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.
':[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.)