criar arquivo de texto a partir de dados [RESOLVIDO]

1. criar arquivo de texto a partir de dados [RESOLVIDO]

andre
andrework

(usa openSUSE)

Enviado em 01/09/2012 - 18:06h

eu tenho uma pasta de cheia de arquivos de texto com dados em forma de tabela.

eu preciso pegar essas informações e criar uma pasta com o nome do arquivo e dentro dessa pasta criar um arquivo novo com o nome do primeiro campo, e com o segundo campo como conteúdo. ex:

tem um arquivo chamado 1234, esse é o seu conteúdo:

título1: dado11 dado12

título3: dado31 dado32

título2: dado2

o script vai criar uma pasta chamada 1234 e criar três arquivos, um chamado título1, outro chamado título2 e o último chamado título3, dentro da pasta 1234.

o conteúdo do aquivo título1 será o dado 11 dado12
o conteúdo do aquivo título2 será o dado 2
o conteúdo do aquivo título3 será o dado 31 dado32.

e assim para todos os arquivos dentro da pasta principal.

eu pesquisei muito e encontrei comandos que poderiam me ajudar, mas eu n sei como fazer a ligação entre eles para completar a função, estudei um pouco e tentei, mas n consegui

imprimindo o primeiro campo da linha que contém ':' (sso serviria para pegar o título1, nome do arquivo.)

awk -F: '/:/ {print $1}'

i

iserindo conteúdo no arquivo (serviria para colocar o dado 11 dentro do arquivo título1.

cat << EOF > título1
dado11 dado12
EOF

imprime do campo 2 até o último (serviria para pegar o dado11 dado12)

awk {'print $2 to $n'}

mas eu n sei como juntar esse comandos de modo a fazer o que eu quero

quando eu uso touch ou mkdir com uma variável, eles não funcionam.

alguém pode me ajudar, serei muito grato.



  


2. MELHOR RESPOSTA

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 02/09/2012 - 16:55h

andrework escreveu:

1234 4567 8907 45788 e etc... cada um terá que ter seu própio diretório.
eu continuei pesquisando e consegui fazer isso também, pode ser útil para alguém.

cat lista | while read linha; #lé o arquivo linha por linha
do nome=`awk -F: '/:/ {print $1}'` #pega o primeiro campo da linha e coloca na variável nome
touch $nome; #cria um arquivo com a variável nome
done;

o problema é que isso só cria os arquivos.

tentei isso:

cat lista | while read linha; #lé o arquivo linha por linha
do nome=`awk -F: '/:/ {print $1}'` #pega o primeiro campo da linha e coloca na variável nome
conteudo =`awk {'print $2 to $n'}` #pega os demais campos da linha e coloca na variável conteúdo
echo "$conteudo" >> $arquivo;
done;

mas ele não aceita o redirecionamento.

o seuscript faz direitinho, mas teria como adaptar para criar vários diretórios, um para cada arquivo?



Sim, :


#!/bin/bash
# para cada arquivo no diretório corrente, executa o script anteriormente postado:
for ARQUIVO in $(ls -1)
do
if mkdir "$ARQUIVO" 2>/dev/null; then
cd "$ARQUIVO" # entra no diretório
# abaixo o while ler linha a linha do arquivo
while read LINHA
do
CONTEUDO=$(echo "$LINHA" | egrep -i 't?tulo.*') # captura o conteudo
TITULO=${CONTEUDO%%:*} # copia tudo antes do :
RESTO=${CONTEUDO##*:} # copia tudo apos o :
[ "$TITULO" ] && > "$TITULO" && echo "$RESTO" >> "$TITULO" # cria o arquivo e coloca o conteudo
done < "../$ARQUIVO"
fi
cd - # sai do diretorio
done





3. Re: criar arquivo de texto a partir de dados [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 02/09/2012 - 00:43h

Podes fazer assim:


#!/bin/bash
if mkdir 1234 2>/dev/null; then
cd 1234 # entra no diretório
# abaixo o while ler linha a linha do arquivo
while read LINHA
do
CONTEUDO=$(echo "$LINHA" | egrep -i 't?tulo.*') # captura o conteudo
TITULO=${CONTEUDO%%:*} # copia tudo antes do :
RESTO=${CONTEUDO##*:} # copia tudo apos o :
[ "$TITULO" ] && > "$TITULO" && echo "$RESTO" >> "$TITULO" # cria o arquivo e coloca o conteudo
done < 1234
fi
cd - # sai do diretorio



4. Re: criar arquivo de texto a partir de dados [RESOLVIDO]

andre
andrework

(usa openSUSE)

Enviado em 02/09/2012 - 12:09h

Obrigado mesmo pela resposta, entendi o script todo, está muito bem explicado.
mas não é só um arquivo, são vários:

1234 4567 8907 45788 e etc... cada um terá que ter seu própio diretório.
eu continuei pesquisando e consegui fazer isso também, pode ser útil para alguém.

cat lista | while read linha; #lé o arquivo linha por linha
do nome=`awk -F: '/:/ {print $1}'` #pega o primeiro campo da linha e coloca na variável nome
touch $nome; #cria um arquivo com a variável nome
done;

o problema é que isso só cria os arquivos.

tentei isso:

cat lista | while read linha; #lé o arquivo linha por linha
do nome=`awk -F: '/:/ {print $1}'` #pega o primeiro campo da linha e coloca na variável nome
conteudo =`awk {'print $2 to $n'}` #pega os demais campos da linha e coloca na variável conteúdo
echo "$conteudo" >> $arquivo;
done;

mas ele não aceita o redirecionamento.

o seuscript faz direitinho, mas teria como adaptar para criar vários diretórios, um para cada arquivo?




5. Re: criar arquivo de texto a partir de dados [RESOLVIDO]

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 02/09/2012 - 16:28h

Oi... espero que isso te ajude.

Eu criei um arquivo chamado 1234 com o seguine conteúdo:

titulo1: dado11 dado12
titulo3: dado31 dado32
titulo2: dado2

Obs. Eu tirei o acento do título pq no meu shell nao deu para corrigir.

Depois escrevi o seguinte script:

awk '{ sub(/\:/,"",$0); system("mkdir "$1); print $3 > $1"/"$2 }' 1234

Fazendo as validações

ls -l titulo*

Boa sorte ai para vc!


6. Re: criar arquivo de texto a partir de dados [RESOLVIDO]

andre
andrework

(usa openSUSE)

Enviado em 02/09/2012 - 17:33h

Obrigado mesmo pelas respostas, espero poder contribuir a comunidade assim um dia.


7. Re: criar arquivo de texto a partir de dados [RESOLVIDO]

andre
andrework

(usa openSUSE)

Enviado em 02/09/2012 - 19:03h

eu modifiquei o script para funcionar com qualquer espressão.
e como os arquivos não possuem extensão, diferenciei os diretórios com o .dir
dá tudo certo, mas quando tem espaços no primeiro campo ele não cria o arquivo, como evitar isso?

for ARQUIVO in $(ls -1)
do
mkdir "$ARQUIVO.dir"
cd "$ARQUIVO.dir"
while read LINHA
do
CONTEUDO=$(echo "$LINHA")
TITULO=${CONTEUDO%%:*}
RESTO=${CONTEUDO##*:}
[ "$TITULO" ] && > "$TITULO" && echo "$RESTO" >> "$TITULO"
done < "../$ARQUIVO"
cd -
done






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts