Quiero extraer la última columna de líneas que se ven así:
880.952 NAV_Y uSimMarine -146.17516
El número no siempre es negativo y no tiene una longitud fija (es decir, no siempre tiene el mismo número de decimales).
Esto me lleva la mayor parte del camino:
grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"
Excepto que también coincide con el número de la primera columna.
Si cambio esto para incluir el final de la línea para eliminar las coincidencias de la primera columna:
grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"
No obtengo coincidencias, lo cual no entiendo.
¿Que me estoy perdiendo aqui?
Respuesta1
Ancle la expresión al final de la línea:
grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"
Si agrega la opción PCRE para -o
devolver solo el grupo capturado, verá que su ejemplo coincide y devuelve la coincidencia deseada:
grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"
-146.17516
Además, para detectar coincidencias de líneas en un archivo con espacios en blanco finales opcionales, simplemente agregue \s*
como:
grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"
Respuesta2
Precediendo a la primera expresión regular con un espacio:
grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"
debería funcionar, ya que excluye la coincidencia al principio de la línea.
Si quieresjustola cuarta columna, puedes lograrlo fácilmente con GNU sed:
sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'
¿Dónde \s
está cualquier carácter de espacio en blanco (espacio, tabulación y los diversos "feeds" 1 ) y \S
un carácter que no sea un espacio, o (de una manera mucho más clara) con sed | cut
:
sed 's/\s\+/\t/g' | cut -f4
que primero compacta todos los espacios en una sola pestaña y luego usa cut
para recortar la cuarta columna. También le permite elegir más columnas fácilmente, por ejemplo, con cut -f1,4
, etc.
1) Es decir: avance de página, avance de línea, retorno de carro, aunque el del medio suele ser interpretado sed
como separador de línea.