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:
awkawk -F: '{if($2>10)print$2}' <filename
-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$ <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: -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.
':[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.)