Montar array com base em um arquivo texto [RESOLVIDO]

1. Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 09:04h

Preciso montar um array baseado em um arquivo texto existente.
Após finalizado este array, preciso gerar uma saída em arquivo que os dados fiquem todos em um única linha separados por espaços.
O arquivo filtrado tem este lay-out:

Nota
Cada nick já está salvo com um espaço na primeira posição.




@_julins
@Shikinhaw_
@Roger_Beni
@Bodescrazy
@Ariel_cg
@thuwris
@pitbullpy
@dodibips
@SallyWentz
@_RingDingDong
@stephany_ck
@troiaoficial
@andy_meadora
@UmaCoisaECerta



O resultado final precisa ser um arquivo assim:


@_julins @Shikinhaw_ @Roger_Beni @Bodescrazy @Ariel_cg @thuwris @pitbullpy @dodibips @SallyWentz @_RingDingDong @stephany_ck @troiaoficial @andy_meadora @UmaCoisaECerta



Estou com dificuldade de pegar o arquivo texto direto passando a um array. Eu acho que já fiz isto antes - rsrs -, mas não estou conseguindo: branco total.

Referência de pesquisa: http://www.vivaolinux.com.br/dica/Utilizando-arrays-em-shell-script



  


2. MELHOR RESPOSTA

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 02/10/2011 - 18:43h

Companheiro, veja se assim fica mais próximo do que você quer :

cat frases.txt
Você conhece a comunidade #VIVAoLINUX ?
Você já visitou a comunidade #VIVAoLINUX ?
Concorra a 1 milhão visitando #VIVAoLINUX ?
.....

cat nicks.txt
@001997JR
@02Biia
@0800vtnc
@081online
@0fael
@100Delicia_
...


cat tuiteropreguicoso.sh

#!/bin/bash
while read FRASE
do
i=0
while read USUARIO
do
USUARIOS[$i]="$USUARIO"
MSG="$FRASE ${USUARIOS[@]}"
QTD=$(echo "$MSG" | wc -m)
if [ $QTD -gt 130 ]; then
echo -e "MSG :$MSG\nTAMANHO :$QTD\n"
i=0
unset USUARIOS
continue
fi
i=$((i+1))
done < nicks.txt
echo -e "MSG :$MSG\nTAMANHO :$QTD\n"
done < frases.txt


saída:
./tuiteropreguicoso.sh

MSG :Você conhece a comunidade #VIVAoLINUX ? @001997JR @02Biia @0800vtnc @081online @0fael @100Delicia_ @10h20 @10neto @1337reis @14Isinha
TAMANHO :134

MSG :Você conhece a comunidade #VIVAoLINUX ? @15Thamy_ @16zombie @18NOVEstefani @1CaRioquinha @1_damiani @1feia_ @1GarotoTop @1horcruxe
TAMANHO :131

MSG :Você conhece a comunidade #VIVAoLINUX ? @1_Jigglypuff @1LitroDeTodinho
TAMANHO :71

MSG :Você já visitou a comunidade #VIVAoLINUX ? @001997JR @02Biia @0800vtnc @081online @0fael @100Delicia_ @10h20 @10neto @1337reis @14Isinha
TAMANHO :137

MSG :Você já visitou a comunidade #VIVAoLINUX ? @15Thamy_ @16zombie @18NOVEstefani @1CaRioquinha @1_damiani @1feia_ @1GarotoTop @1horcruxe
TAMANHO :134

MSG :Você já visitou a comunidade #VIVAoLINUX ? @1_Jigglypuff @1LitroDeTodinho
TAMANHO :74

MSG :Concorra a 1 milhão visitando #VIVAoLINUX ? @001997JR @02Biia @0800vtnc @081online @0fael @100Delicia_ @10h20 @10neto @1337reis @14Isinha
TAMANHO :138

MSG :Concorra a 1 milhão visitando #VIVAoLINUX ? @15Thamy_ @16zombie @18NOVEstefani @1CaRioquinha @1_damiani @1feia_ @1GarotoTop @1horcruxe
TAMANHO :135

MSG :Concorra a 1 milhão visitando #VIVAoLINUX ? @1_Jigglypuff @1LitroDeTodinho
TAMANHO :75



3. Re: Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 09:15h

MinhaVar=$(cat MeuArquivo.txt) não funciona rrs.
Quando eu envio um >> para o arquivo de saída ele vai com um nome por linha.



4. Re: Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 09:24h


#!/bin/bash
# file: naosegue.sh
# Continuação......
# Author: Geraldo T. Albuquerque aka @GA_Tux (aprendinolinux@gmail.com)
# Pegar o arquivo salvo e processar gerando um outro só com os perfis
# tudo em um única linha.
# $1 = arquivo a ser lido.
# $2 = arquivo temporário
# $3 = arquivo que será gerado.

function pega_nick()
{

cat "$1" | grep ' @' >> "$2" #Arquivo temporário foi salvo e cada nick tem uma linha com espaço na primeira posição.
}

function monta_array()
{
MyArray=$(cat $2)
echo ${MyArray[*]} >> $3 #Gerando o arquivo de saída em uma linha.
}

pega_nick $1 $2 $3
monta_array $1 $2 $3


Tem outros erros nesta passagem de parâmetros também. ;)
Se não gerar o arquivo temporário acho que ficará até melhor.
Processar tudo em memória deve ser mais rápido.

off-topic: http://www.vivaolinux.com.br/topico/Off-Code-Cafe/Acordando-com-Led-Zeppelin/?pagina=12#142


5. Re: Montar array com base em um arquivo texto [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 02/10/2011 - 10:45h

Cara,

Será que ao invés disso ... um simples xargs não resolve?

Sua_variavel=`grep ' @' seu_arquivo' | xargs `
echo $Sua_variavel


se quiser tb pode utilizar ao inves do xargs um tr.
Sua_variavel=`grep ' @' seu_arquivo' | tr '\n' " " `

Tem várias formas de se fazer, inclusive com um loop tb.
while read line
do
linha="$linha $line"
done < teste
echo $linha

Usando o array

while read line
do
counter=$(( $counter + 1 ))
MyArray[$counter]="$line"
done < teste
echo ${MyArray[*]}

mas as primeiras me parecem bem mais simples.



6. Re: Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 12:01h

fdmarp escreveu:

Cara,

Será que ao invés disso ... um simples xargs não resolve?




Pesquisando sobre xargs ;) Valeu. Volto com a resposta.



7. Re: Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 12:14h

Olá @fdmarp Fiz assim:

Sua_variavel=$(grep ' @' naoseguem.txt | tr '\n' " " )
echo $Sua_variavel >> tt.txt


Arquivo tt.txt ficou com 1 em cada linha.


@_julins
@Shikinhaw_
@Roger_Beni
@Bodescrazy
@Ariel_cg
@thuwris
@pitbullpy
@dodibips
@SallyWentz
@_RingDingDong
@stephany_ck
@troiaoficial
@andy_meadora
@UmaCoisaECerta


Pior é que em vários outros scripts eu queria deixar linha por linha e o arquivo era gerado tudo em uma só rsrs. Agora quero em uma linha e ele só gera linha a linha.
O problema com certeza está atras do teclado. Ressaca da saideira rsrs.

Ainda não aprendi usar o xargs

Detalhe extra: Este arquivo tem 40.000 linhas rsrs.
Quando resolver o problema de ficar em um linha, vou precisar pegar um tamanho de 80 caracteres. Mas aí é outra história.



8. Re: Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 12:29h

Achei que era o IFS, mas aparentemente não é:

OldIFS=$IFS
IFS=" "
Sua_variavel=$(grep ' @' naoseguem.txt | tr '\n' " " )
echo ${Sua_variavel[@]} >> tt.txt
IFS=$OldIFS





9. Re: Montar array com base em um arquivo texto [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 02/10/2011 - 12:40h

bom, testei no Debian e no Solaris e funcionou exatamente do jeito que vc mandou ... vou pensar um pouco ... talvez tenha a ver com o SO que criou o arquivo ... mas enquanto isso ... o xargs funcionou?

Se não tenta o loop.




10. Re: Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 13:21h

fdmarp escreveu:

bom, testei no Debian e no Solaris e funcionou exatamente do jeito que vc mandou ... vou pensar um pouco ... talvez tenha a ver com o SO que criou o arquivo ... mas enquanto isso ... o xargs funcionou?

Se não tenta o loop.



Vou tentar o loop ;)
Com o xargs eu nem tentei pq deu erro e acho que não sei usar.


11. Re: Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 14:17h

Onde está o erro ? Não mostra nem o echo parado no read....
Dentro de while não pode ter echo ?


rm tt.txt

MyArray=""
while read linha;do
echo " o que está acontecendo aqui ? "
read
Mytmp=$(echo $linha )
echo "o que vale $Mytmp ????"
read -t 5
MyArray[${linha}]="${MyArray} $Mytmp"
done < "meuarq.txt"


echo ${MyArray[@]} > tt.txt



off-topic: http://www.vivaolinux.com.br/topico/Off-Code-Cafe/Acordando-com-Led-Zeppelin?pagina=13&num_por_p...

Acho que vou tomar umas biritas rsrs


12. Re: Montar array com base em um arquivo texto [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/10/2011 - 14:35h

Quem quiser fazer o teste, monte o arquivo abaixo meuarq.txt
Lembrando que existe um espaço no início de cada @


@_julins
@Shikinhaw_
@Roger_Beni
@Bodescrazy
@Ariel_cg
@thuwris
@pitbullpy
@dodibips
@SallyWentz
@_RingDingDong
@stephany_ck
@troiaoficial
@andy_meadora
@UmaCoisaECerta


Resultado final: Deve gravar o arquivo tt.txt da seguite forma.



@_julins @Shikinhaw_ @Roger_Beni @Bodescrazy @Ariel_cg @thuwris @pitbullpy @dodibips @SallyWentz @_RingDingDong @stephany_ck @troiaoficial @andy_meadora @UmaCoisaECerta






01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts