¿Cómo extraer solo valores mayores que un umbral de un archivo?


10

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:


18

Con awk

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

Explicaciones

  • -F:- establece el Fseparador de campo en:
  • {if($2>10)print$2}- para cada línea, la prueba si el 2campo es encontrar >10, si así printlo
  • <filename- deje que el shell abra el archivo filename, eso es mejor que dejar awkque haga eso, vea la respuesta de Stéphane Chazelas sobre el tema

Ejecución de ejemplo

$ <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

muchas gracias por su ayuda, solución perfecta, ¿puedo usar solo los comandos 'cortar' y 'grep' (comandos básicos) en esta situación para mostrar del archivo solo promedios superiores a 10 ..
Haikel Fazzani

Entiendo tu solución, perfecto, muchas gracias por tu ayuda, agradezco todos tus esfuerzos ...
Haikel Fazzani

No se olvide que bash tratar [[ $0 > 10 ]]como una comparación léxica - y, en cualquier caso, no es de mucha ayuda para los valores no enteros
steeldriver

@dessert: personalmente prefiero poner el patrón antes de las declaraciones de acción, por ejemplo: awk -F: '$ 2> 10 {print $ 2}', ya que me parece más ordenado y más fácil de extender (por ejemplo, $ 2> 10 && $ 2 <100) .
Stefan

3

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 ;-).


¡Muy inteligente! Se puede acortar a grep ':[1-9][0-9]\+\.' <file | cut -d: -f2y 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.
postre

He encontrado un error en mi RegEx: para números sin punto decimal, el RegEx tiene que ser: ':[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.)
Stefan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.