Tengo este archivo:
names average
john:15.02
Mark:09.63
James:12.58
Quiero extraer solo los promedios mayores de 10, por lo que la salida en este ejemplo debería ser:
15.02
12.58
Tengo este archivo:
names average
john:15.02
Mark:09.63
James:12.58
Quiero extraer solo los promedios mayores de 10, por lo que la salida en este ejemplo debería ser:
15.02
12.58
Respuestas:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
- establece el F
separador de campo en:
{if($2>10)print$2}
- para cada línea, la prueba si el 2
campo es encontrar >10
, si así print
lo<filename
- deje que el shell abra el archivo filename
, eso es mejor que dejar awk
que haga eso, vea la respuesta de Stéphane Chazelas sobre el tema$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58
También es posible agregar espacios y colocar el patrón fuera de los corchetes, por lo que son iguales, gracias a Stefan por señalarlo:
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 ]]
como una comparación léxica - y, en cualquier caso, no es de mucha ayuda para los valores no enteros
Con grep tendrías que trabajar con expresiones regulares; p.ej
grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2
como con sed:
sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file
Pero usar RegEx en datos ordenados es propenso a errores (en mi experiencia) y difícil de leer ;-).
grep ':[1-9][0-9]\+\.' <file | cut -d: -f2
y sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file
. Vale la pena mencionar que esto funciona solo con> 1,> 10,> 100, etc., por ejemplo,> 20 sería imposible.
':[1-9][0-9]\+\.\?'
- el punto decimal literal \. es opcional y coincide como máximo una vez? (@dessert gracias por señalar la restricción de mi RegEx.)