Script para bilro do FD.
Esse post é uma resposta para a pergunta do bilro, um user do FD (leia FórumDebian).
A questão:
“Sou novo por aqui e nesta programação e caso cometa alguma falha peço desculpa!!
A minha duvida é a seguinte: eu queria apartir de um shell script ir ler dados a um outro ficheiro em que os dados se encontram divididos por ‘:’
exemplo:
casa:123:12:14
carro:123:1223:132
etc….
eu gostaria de criar um vector ( ex: coisa[i] ) em que cada indice fosse cada dado da 1º coluna , outro vector para a 2º coluna ( serie[i] ) , etc…
neste caso, coisa[1]= casa ; coisa[2]= carro ; serie[1]= 123….
Caso alguem me podesse dar uma dica agradeço!!“
Se quiserem verem o resto do post clique aqui. Lá tu veras o que teve entre a “pergunta” e “resposta” .
Bem… Vamos lá.
Primeiro vou falar o que eu fiz. Temos dois arquivos.
script.sh – Nosso script.
txt — Nossa lista de argumentos.
O nosso arquivo txt contem:
:haus:123:casa:
:bier:456:cerveja:
:welt:789:mundo:
:ein:1:um:
E o nosso script tem isso:
#!/bin/sh
function getInfo() {
cat -n txt | egrep “^ *$1″ | cut -f$2 -d”:”
}
function getLines() {
echo “$(cat -n txt | tail -n1 | cut -f1 -d”:” | cut -f6 -d” “) + 1″ | bc
}
function main() {
NLINES=$(getLines)
X=1
while [ $X != $NLINES ]; do
INFO=$(getInfo $X $1)
echo $INFO
X=$(echo “$X + 1″ | bc)done
}
main $1
Pronto vou falar de cada fun¢ão seguindo a lista da fun¢ão main.
A getLines retorna quantas linhas o arquivo tem. O comando cat -n txt pega o conteudo do arquivo e gera o número da linha na frente de cada linha de dados, com o | (pipe) jogamos o resultado dele para o tail. O tail -n1 mostra a ultima linha do arquivo e passando para o cut -f1 -d”:” . Cut é o que o nome diz, ele recorta o resultado que queremos na linha. Nesse caso ele vai pegar tudo que estiver atras do primeiro : que ele achar. No caso o nosso número gerado pelo cat -n txt. Depois ainda recortamos as 6 casa em branco geradas pelo cat -n txt retornando apenas o número da ultima linha.
Essa fun¢ão não irá funcionar com um arquivo maior ou igual a 10 linhas. Estou fazendo esse script para mostrar como fazer o trabalho e não a solu¢ão completa.
Ok. Pegamos o número de linhas do arquivo txt e jogamos o valor na variável NLINES. Geramos um “counter” chamado X já com valor 1. Depois fazemos um while simples, ele irá fazer aquela lista de comandos até quando aquela afirma¢ão ($X != $NLINES) for verdade. Chegamos na getInfo.
A getInfo nos mostra qual argumento da linha que apontamos. Comando cat -n txt já falei sobre. O egrep “^ *$1″ é um comando para mostrar as linhas que come¢ão (^) com um ou mais espa¢os em branco e que venha com o valor que eu escolher e fornecer primeiro para a fun¢ão ($1), no nosso caso o número da linha que queremos apontar. Com isso o cut -f$2 -d”:” pega o argumento que estiver atras do valor que nossa variável ($2) fornecerá.
Rodando o script (sh script.sh 2) irá aparecer isso na tela:
haus
bier
welt
ein
Bem dei a dica e meio que apontei o caminho. E lembre-se, esse script não roda perfeito. Ele só aceita 9 linhas no arquivo txt. É apenas uma dica de como fazer o seu programa lá.




Adorei o blog de vocês , muito legal!! parabéns! Se puderem visitar meu site também sobre terapia de vidas passadas http://www.espacoauryn.com .
abraços