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]}
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
Uma alternativa
N=3 STRING="one two three four" arr=($STRING) echo ${arr[N-1]}
fonte
IFS
(o separador de campo interno) para ':' ou algo em vez de espaço em branco, altere-o de volta antes de tentar isso.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
fonte
Um arquivo contendo algumas declarações:
Resultado:
Então, para imprimir a 4ª palavra deste tipo de declaração:
cat test.txt |awk '{print $4}'
Resultado :
fonte
Sem garfos caros, sem tubos, sem bashismos:
$ set -- $STRING $ eval echo \${$N} three
Mas tome cuidado com as bolhas.
fonte
STRING=(one two three four) echo "${STRING[n]}"
fonte