mlgrassi
(usa Debian)
Enviado em 11/07/2017 - 16:14h
listeiro_037 escreveu:
Essa coisa não vem pelo menos com cabeçalhos na colunas? Essa primeira linha com Nome ... Telefone ... existe?
Dá para criar uma verificação de posição de cabeçalho. Depende, criar um array.
linha_cabecalho=($(head -1 documento.txt | tr ';' ' ')
head -1 pega a primeira linha do arquivo. Depois
tr troca os separadores de ponto-e-vírgula por espaços. Tudo executado em subshell
$(...) . O par de parêntesis a mais
(...) serve para transformar a saída subshell
$(...) no array linha_cabecalho.
O problema agora é indexar a saída. As colunas do arquivo se comparadas com os índices do array diferem de uma unidade. Dá para tentar algo assim:
cont=1
for i in ${linha_cabecalho[@]}
do
cut -d';' -f $cont documento.txt > Campo-$i.txt
let cont++
done
O loop passa um a um nos elementos do vetor. A variável cont serve como índices de campos para o comando cut cortar os campos conforme o cabeçalho. A saída é jogada em campos com os nomes dos cabeçalhos.
Pronto. Agora os campos estão separados por arquivos. Você só precisará juntá-los na ordem que quiser. Para isto será usado o comando paste.
paste -d';' arquivo1.txt arquivo2.txt arquivo3.txt ... > arquivo_final.txt
rm Campo-*.txt
A opção
-d';' cola os campos um do lado do outro separando-os por
;. Use espaço em branco ou outra coisa para criar um formato adequado.
Depois dos arquivos colados e padronizados, você poderá usar o comando
sort. Veja antes se até aqui deu certo.
Favor adaptar.
Amigo, gostei muito de sua ideia, mas me da uma dica para a seguinte linha:
linha_cabecalho=($(head -1 documento.txt | tr ';' ' ')
Mas na verdade encontrei um problema aqui. Quando o vetor é populado com o comando acima, existe um campo da coluna que possui espaços, que no caso é o campo
Nome do Cliente. Ocorre que como o delimitador default em vetores é o espaço em branco, cada palavra do campo será atribuída a um índice, ou seja, índice x=Nome índice y=do e índice z=Cliente.
Na tentativa de contornar este problema, eu alterei o comando acima para utilizar o sed como substituidor de strings ao invés do tr, para incluir áspas duplas em cada campo para estes serem interpretados como devem ser:
linha_cabecalho=($(head -1 documento.txt | sed "s/^\|$/\"/g" | sed "s/\;/\"\ \"/g"))
Isto irá gerar a saída:
"Telefone" "Endereço" "Nome do Cliente" "ID" "Bairro" "Estado" "Cidade" "Número"
Até aí tudo bem. O problema ocorre quando isso é atribuído ao vetor linha_cabecalho, onde as áspas duplas são interpretadas como caractere e não como intervalo de dados.
Alguma sugestão para resolver isso?