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]}
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
Una alternativa
N=3 STRING="one two three four" arr=($STRING) echo ${arr[N-1]}
fuente
IFS
(el separador de campo interno) en ':' o algo en lugar de un espacio en blanco, cámbielo antes de intentar esto.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
fuente
Un archivo que contiene algunas declaraciones:
Resultado:
Entonces, para imprimir la cuarta palabra de este tipo de declaración:
cat test.txt |awk '{print $4}'
Salida:
fuente
Sin tenedores costosos, sin tuberías, sin bashismos:
$ set -- $STRING $ eval echo \${$N} three
Pero tenga cuidado con el globbing.
fuente
STRING=(one two three four) echo "${STRING[n]}"
fuente