¿Hay alguna manera de hacer que el comando de corte lea solo el último campo?

10

Tengo una cadena separada por espacios que se emite mediante un comando, que me gusta canalizar cut, usando -fd ' 'para dividir en espacios. Sé que puedo usar -f <n>para mostrar el número de campo <n>, pero ¿puedo hacer que muestre el último campo si no sé la longitud de la cadena?

¿O necesito usar una herramienta de edición de texto más flexible como sedo awk?

Arronico
fuente
Creo que el comando de corte no puede soportar, pero no estoy seguro, ¿intentó con cut -d '' -f-?
αғsнιη
3
Más formas de hacerlo: stackoverflow.com/questions/22727107/…
edwinksl
@KasiyA lo -nconvierte en n desde el principio, n-es desde n hasta el final, y existe la --complementopción que invierte la selección. Pero no hay manera de contar el número de campos y actuar sobre él hasta donde puedo decir.
Arronical

Respuestas:

12

No cut, no puedo hacer eso. Podrías usar dos revcomandos, como

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

pero generalmente es más fácil de usar awk:

echo 'foo bar baz' | awk '{print $(NF)}'
Florian Diesch
fuente
7

Puede hacer esto usando solo shell, no se necesita ninguna herramienta externa, usando la expansión de parámetros:

${var##* }

var##*descartará todo, desde el inicio hasta el último espacio del parámetro (variable) var.

Si el delimitador puede ser cualquier espacio en blanco, por ejemplo, espacio o tabulación, use la clase de caracteres [:blank:]:

${var##*[[:blank:]]}

Ejemplo:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg
heemayl
fuente
Había hablado sobre el uso de la expansión de parámetros en un comentario sobre la respuesta de Severus Tux, pero la clase de caracteres en blanco es información útil, gracias.
Arronical
4

Personalmente, me gusta la respuesta de Florian Diesch. Pero hay de esta manera también.

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

Explicación:

wc -wda la cantidad de palabras. y cutcorta la última palabra

EDITAR:

Pensé en otra forma de hacerlo:

echo "Any random string here" | tac -s' ' | head -1
Severus Tux
fuente
Correcto, pero esto es cierto cuando delim es espacio o tabulación, y si su delimitación de corte no es la misma, esto fallará
α --sнιη
Buen pensamiento lateral, aunque si estoy configurando a="my string here", también podría usar la expansión de parámetros ${a##* }.
Arronical
1
Sí, pero el OP dijo que tenía una cadena separada por espacios.
Severus Tux
2

Aquí hay uno usando grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

Cómo funciona:

  • grep con -oImprimir solo las partes coincidentes (no vacías) de una línea coincidente.
  • La expresión regular [^ ]*$coincide con cualquier cosa desde el final hasta que encuentra un espacio.

Otro trazador de líneas de Glenn Jackman usando Perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
souravc
fuente