Postagem em destaque

Selecionando o último campo em uma cadeia dinâmica


Em shell script a programação se resume em tratamento e manipulação de dados exibidos na saída padrão ou por atribuição direta a uma variável, principalmente em casos onde os dados são dinâmicos, ou seja, sendo necessário extrair uma determinada coluna ou campo. A importância no conhecimento e domínio dos comandos para tal implementação é de suma importância já que tais dados serão tratados posteriormente por outras rotinas para validação.

Vou apresentar alguns exemplos com diferentes implementações das quais vou utilizar o conteúdo do arquivo usuarios.txt, cujas as linhas contém as informações de cada usuário no seguinte formato:

nome, sobrenome, idade, cidade
O último campo requerido contém o nome da cidade.

Conteúdo:
$ cat usuarios.txt 
Marcia,Nogueira,42,Osasco
Lucas,Silva,23,Campo Grande
Fernanda,Lopes,34,Arantina
Jonas,Ferreira,31,Juiz de Fora
Marcia,Rodrigues,53,Salvador
Jessica,Alves,21,Manaus
Note que os campos são delimitados pelo caractere ',' (vírgula).

Vale a pena ressaltar que os métodos a seguir podem ser aplicados a um número indeterminado de campos, já que o propósito é tratar e extrair apenas o último elemento em uma cadeia dinâmica de dados, que ao contrário do conteúdo utilizado a quantidade já está pré determinada e que pode ser facilmente especificada.

Todos os métodos abaixo tem o mesmo afeito e retornam a seguinte saída:
Osasco 
Campo Grande 
Arantina 
Juiz de Fora 
Salvador 
Manaus

Métodos:

1. Obtendo a quantidade total de delimitadores por linha.
#!/bin/bash

# Lê cada linha do arquivo e armazena em 'line'.
while read line; do
    # Remove todos os caracteres exceto o delimitador ',' (vírgula)
    delm=${line//[^,]/}
    # Incrementa +1 a quantidade de delimitadores presentes
    # em 'delm' para obter o número do último campo.
    cut -d',' -f $((${#delm}+1)) <<< "$line"
done < usuarios.txt

2. Utilizando expansão de variáveis
#!/bin/bash

while read line; do
    # Remove todos os caracteres iniciais até o último delimitador.
    echo "${line##*,}"
done < usuarios.txt

3. Utilizando o comando awk.
#!/bin/bash

# Imprime o contéudo do argumento posicional contido na posição 'NF'.
awk -F',' '{print $NF}' usuarios.txt 

4. Aplicando uma simples expressão regular com o comando grep.
#!/bin/bash

# Captura somente a expressão ao final da linha. (exceto o delimitador)
grep -Eo '[^,]+$' usuarios.txt

5. sed (o mesmo que o método 2).
#!/bin/bash

# Remove todo conteúdo inicial até o delimitador (inclusive).
sed 's/^.*,//' usuarios.txt

6. Utilizando a função string.field da biblioteca string.sh.
#!/bin/bash

# Importando
source string.sh

# Utiliza-se notação negativa para deslocamento reverso dos campos, 
# onde '-1' refere-se ao último campo.
string.field "$(< usuarios.txt)" ',' -1

A função string.field aceita o uso de notação negativa para leitura reversa dos campos, onde '-1' refere-se ao último, '-2' penúltimo, '-3' antepenúltimo e assim por diante, permitindo a captura independente da quantidade de campos presentes.

Considerações finais:
  • O Delimitador deve ser um caractere único.
  • Substitua o delimitador ',' (vírgula) utilizado nos métodos acima pelo caractere de sua preferência.

Comentários

Contato

Nome

E-mail *

Mensagem *