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?

Respuestas:


95
echo $STRING | cut -d " " -f $N

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]}

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

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

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.


2
STRING=(one two three four)
echo "${STRING[n]}"

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