Implementar variável para cada linha de um arquivo [RESOLVIDO]

1. Implementar variável para cada linha de um arquivo [RESOLVIDO]

Elton Chaves
chavesejf

(usa Ubuntu)

Enviado em 05/04/2016 - 00:00h

Olá pessoal,

Estou escrevendo um script para uso pessoal no trabalho e empaquei no seguinte problema:
Tenho um arquivo com 15 linhas, cada linha especifica para um código de 3 caracteres, ex.:

o arquivo ligantes.txt apresenta o seguinte conteúdo:

0rb
4pj
3oe
1ru
2rj
4oi
3jk
3kr
jp2
jp3

Estou tentando implementar uma variável para cada linha deste arquivo, ex.:

LIG1=0rb
LIG2=4pj
LIG3=3oe
...
LIG10=jp3

Tendo essa problemática, fiz o seguinte:

for i in `seq 1 10`; do LIG"$i"=`cat ligantes.txt | grep -n ^ | grep ^"$i": | cut -d: -f2`; done

como saída, tive o seguinte resultado:

LIG1=0rb: comando não encontrado
LIG2=4pj: comando não encontrado
...
LIG10=jp3: comando não encontrado

Vocês têm alguma sugestão do que pode está errado ? Alguma sugestão?

Obrigado.


  


2. Re: Implementar variável para cada linha de um arquivo

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/04/2016 - 01:13h

chavesejf escreveu:
Olá pessoal,
Estou escrevendo um script para uso pessoal no trabalho e empaquei no seguinte problema:
Tenho um arquivo com 15 linhas, cada linha especifica para um código de 3 caracteres, ex.:
o arquivo ligantes.txt apresenta o seguinte conteúdo:
0rb
4pj
3oe
1ru
2rj
4oi
3jk
3kr
jp2
jp3
Estou tentando implementar uma variável para cada linha deste arquivo, ex.:
LIG1=0rb
...
LIG10=jp3
Tendo essa problemática, fiz o seguinte:
for i in `seq 1 10`; do LIG"$i"=`cat ligantes.txt | grep -n ^ | grep ^"$i": | cut -d: -f2`; done
como saída, tive o seguinte resultado:
LIG1=0rb: comando não encontrado
. . .
LIG10=jp3: comando não encontrado
Vocês têm alguma sugestão do que pode está errado ? Alguma sugestão?
Obrigado.


Boa noite chavesejf.
Segue a sugestão/solução:
Para GERAR as VARS:

NN=$(awk 'END {print NR}' ligantes.txt)
for ((x=1;x<=$NN;x++))do eval LIG$x=$(sed -n "$x"p ligantes.txt);done


Para Ler/testar:
for X in LIG{1..10};do echo "$X": "${!X}";done 

SAíDA:

LIG1: 0rb
LIG2: 4pj
LIG3: 3oe
LIG4: 1ru
LIG5: 2rj
LIG6: 4oi
LIG7: 3jk
LIG8: 3kr
LIG9: jp2
LIG10: jp3



É isso...

----------------------------------------------------------------------------------------
Se resolver, marque como resolvido, por favor.
Gostando da resposta, marque-a como a MELHOR, dessa forma, ganho uns pontinhos,
o que incentiva a continuar colaborando, ajudando, participando e compartilhando conhecimentos . . . :)
----------------------------------------------------------------------------------------
Abç.:
Marcelo




3. Re: Implementar variável para cada linha de um arquivo [RESOLVIDO]

Ronaldo Ferreira de Lima
textmode

(usa Slackware)

Enviado em 05/04/2016 - 11:10h

chavesejf,

Se possível, utilize arrays.

Um exemplo com o bash:


$ mapfile -t lig < ligantes.txt
$ echo ${lig[0]}


Outro com o awk:


awk '{lig[NR]=$0}END{print lig[1]}' ligantes.txt



4. Re: Implementar variável para cada linha de um arquivo [RESOLVIDO]

Elton Chaves
chavesejf

(usa Ubuntu)

Enviado em 05/04/2016 - 12:55h

msoliver escreveu:

Boa noite chavesejf.
Segue a sugestão/solução:
Para GERAR as VARS:

NN=$(awk 'END {print NR}' ligantes.txt)
for ((x=1;x<=$NN;x++))do eval LIG$x=$(sed -n "$x"p ligantes.txt);done


Para Ler/testar:
for X in LIG{1..10};do echo "$X": "${!X}";done 

SAíDA:

LIG1: 0rb
LIG2: 4pj
LIG3: 3oe
LIG4: 1ru
LIG5: 2rj
LIG6: 4oi
LIG7: 3jk
LIG8: 3kr
LIG9: jp2
LIG10: jp3



É isso...



Prezado msoliver,

Muito obrigado pela sugestão, funcionou perfeitamente.
Fiz a implementação da sua sugestão no script que estou escrevendo e disponibilizo aqui para possíveis usuários que compartilhem da mesma dúvida.

LER ARQUIVO, GERAR VARS e IMPRIMIR VARS
			
echo -n "2. Forneça o nome do arquivo com o nome dos ligantes ==> "
read INPUT
if [ -e $INPUT ]; then
TOTALIG=$(awk 'END {print NR}' "$INPUT")
echo ""$TOTALIG" ligante(s)"
echo
for ((i=1;i<=$TOTALIG;i++)); do
eval LIG$i=$(sed -n "$i"p $INPUT)
for x in LIG"$i"; do
echo "$x": "${!x}"
done
done
echo
fi


SAÍDA

LIG1: 0rb
LIG2: 1mx
LIG3: 5mx
LIG4: 7dg
LIG5: 9dg
LIG6: 19j
LIG7: 19l
LIG8: 19m
LIG9: ej5
LIG10: jp2
LIG11: jp3
LIG12: mog
LIG13: neo
LIG14: pt1
LIG15: rs8


Mais uma vez, obrigado pelo suporte.
Agradeço também a sugestão do colega textmode.

Obrigado pessoal.


5. Re: Implementar variável para cada linha de um arquivo [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/04/2016 - 14:09h

chavesejf escreveu:

msoliver escreveu:

Boa noite chavesejf.
Segue a sugestão/solução:
Para GERAR as VARS:

NN=$(awk 'END {print NR}' ligantes.txt)
for ((x=1;x<=$NN;x++))do eval LIG$x=$(sed -n "$x"p ligantes.txt);done


Para Ler/testar:
for X in LIG{1..10};do echo "$X": "${!X}";done 

SAíDA:

LIG1: 0rb
LIG2: 4pj
LIG3: 3oe
LIG4: 1ru
LIG5: 2rj
LIG6: 4oi
LIG7: 3jk
LIG8: 3kr
LIG9: jp2
LIG10: jp3



É isso...



Prezado msoliver,

Muito obrigado pela sugestão, funcionou perfeitamente.
Fiz a implementação da sua sugestão no script que estou escrevendo e disponibilizo aqui para possíveis usuários que compartilhem da mesma dúvida.

LER ARQUIVO, GERAR VARS e IMPRIMIR VARS
			
echo -n "2. Forneça o nome do arquivo com o nome dos ligantes ==> "
read INPUT
if [ -e $INPUT ]; then
TOTALIG=$(awk 'END {print NR}' "$INPUT")
echo ""$TOTALIG" ligante(s)"
echo
for ((i=1;i<=$TOTALIG;i++)); do
eval LIG$i=$(sed -n "$i"p $INPUT)
for x in LIG"$i"; do
echo "$x": "${!x}"
done
done
echo
fi


SAÍDA

LIG1: 0rb
LIG2: 1mx
LIG3: 5mx
LIG4: 7dg
LIG5: 9dg
LIG6: 19j
LIG7: 19l
LIG8: 19m
LIG9: ej5
LIG10: jp2
LIG11: jp3
LIG12: mog
LIG13: neo
LIG14: pt1
LIG15: rs8

Mais uma vez, obrigado pelo suporte.
Agradeço também a sugestão do colega textmode.
Obrigado pessoal.


Por nada!
Precisando, estou por aqui.
Se não for pedir muito .... rsrsrsrs
Escolha como a melhor resposta . . .

Abraço,
Marcelo








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts