Enésima palavra em uma variável de string

87

No Bash, quero obter a enésima palavra de uma string mantida por uma variável.

Por exemplo:

STRING="one two three four"
N=3

Resultado:

"three"

Que comando / script Bash poderia fazer isso?

Nicolas Raoul
fonte

Respostas:

99
echo $STRING | cut -d " " -f $N
Amardeep AC9MF
fonte
3
o corte falhará ao solicitar um campo que não existe. Em vez de retornar "", ele retornará a própria string. Exemplo: echo "aaaa" | O resultado cut -f2 é "aaaa", não o resultado de comprimento zero em branco.
ajaaskel
@ajaaskel Isso parece acontecer quando o delimitador não é encontrado na entrada. E esse comportamento pode hoje em dia ser alterado usando a opção --only-delimited.
Samuli Pahaoja de
64

Uma alternativa

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}
aioobe
fonte
3
Usar arrays bash para essa é "a melhor" solução, odeio usar awk ou sed, pois não os vejo instalados em todas as configurações, especialmente na configuração msys.
Sundar
1
Mesmo que o eco "não seja necessário", achei útil para entender como usar os elementos arr. Obrigado
Chen Li Yong
1
Se você configurou IFS(o separador de campo interno) para ':' ou algo em vez de espaço em branco, altere-o de volta antes de tentar isso.
Noumenon de
1
Esta deve ser a resposta certa. Usar arrays para esse propósito é simples e inteligente.
ajaaskel
32

Usando awk

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

Teste

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

Um arquivo contendo algumas declarações:

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

Então, para imprimir a 4ª palavra deste tipo de declaração:

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

Resultado :

1st
2nd
3rd
4th
5th
Akhiljith PB
fonte
2
O OP diz que a string está em uma variável, não em um arquivo.
codeforester
3

Sem garfos caros, sem tubos, sem bashismos:

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

Mas tome cuidado com as bolhas.

Jens
fonte
2
STRING=(one two three four)
echo "${STRING[n]}"
mnrl
fonte
2
Em seu exemplo, STRING é realmente uma string? Parece uma matriz.
Nicolas Raoul
@NicolasRaoul Sim, na verdade você está certo. Mas escrevi para ser uma alternativa para.
mnrl de