Enésima palabra en una variable de cadena

85

En Bash, quiero obtener la enésima palabra de una cadena retenida por una variable.

Por ejemplo:

STRING="one two three four"
N=3

Resultado:

"three"

¿Qué comando / script de Bash podría hacer esto?

Nicolas Raoul
fuente

Respuestas:

95
echo $STRING | cut -d " " -f $N
Amardeep AC9MF
fuente
3
cut fallará al solicitar un campo que no existe. En lugar de devolver "" devolverá la cadena en sí. Ejemplo: echo "aaaa" | cut -f2 resultado es "aaaa", no resultado de longitud cero en blanco.
ajaaskel
@ajaaskel Eso parece suceder cuando el delimitador no se encuentra en la entrada. Y ese comportamiento hoy en día se puede alterar usando option --only-delimited.
Samuli Pahaoja
64

Una alternativa

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}
aioobe
fuente
3
El uso de matrices bash para esto es "la mejor" solución, odio usar awk o sed, ya que no los veo instalados en todas las configuraciones, especialmente en la configuración de msys.
Domingo
1
Aunque el eco "no es necesario", lo encontré útil para comprender cómo usar los elementos arr. Gracias
Chen Li Yong
1
Si ha establecido IFS(el separador de campo interno) en ':' o algo en lugar de un espacio en blanco, cámbielo antes de intentar esto.
Noumenon
1
Esta debería ser la respuesta correcta. El uso de matrices para este propósito es simple e inteligente.
ajaaskel
31

Utilizando awk

echo $STRING | awk -v N=$N '{print $N}'

Prueba

% N=3
% STRING="one two three four"
% echo $STRING | awk -v N=$N '{print $N}'
three
jkshah
fuente
9

Un archivo que contiene algunas declaraciones:

cat test.txt

Resultado:

This is the 1st Statement
This is the 2nd Statement
This is the 3rd Statement
This is the 4th Statement
This is the 5th Statement

Entonces, para imprimir la cuarta palabra de este tipo de declaración:

cat test.txt |awk '{print $4}'

Salida:

1st
2nd
3rd
4th
5th
Akhiljith PB
fuente
2
El OP dice que la cadena está en una variable, no en un archivo.
Codeforester
3

Sin tenedores costosos, sin tuberías, sin bashismos:

$ set -- $STRING
$ eval echo \${$N}
three

Pero tenga cuidado con el globbing.

Jens
fuente
2
STRING=(one two three four)
echo "${STRING[n]}"
mnrl
fuente
2
En tu ejemplo, ¿STRING es realmente una cadena? Parece una matriz.
Nicolas Raoul
@NicolasRaoul Sí, de hecho tienes razón. Pero he escrito para ser una alternativa a.
2013