The UNIX and Linux Forums  

Go Back   O UNIX e Linux Forum > Top Fóruns > Programação Shell Script e
.
google unix.com



Programação Shell Script e Post perguntas sobre ksh, CSH, SH, BASH, Perl, PHP, SED, Awk e outros scripts shell e shell scripts línguas aqui.

Mais UNIX e Linux Fórum Tópicos Você pode achar Helpfull
Fio Thread Starter Fórum Respostas Última postagem
dividir com base no número de caracteres chriss_58 Programação Shell Script e 6 07-06-2008 11:05
Dividir um arquivo baseado no padrão em awk, grep, sed ou perl kumarn Programação Shell Script e 5 06-20-2008 11:51
Dividir um arquivo com nenhum padrão - Split, Csplit, Awk madhunk UNIX para Dummies Perguntas & Respostas 10 12-17-2007 12:57
extrair uma linha baseada em linha narendra.pant Programação Shell Script e 2 09-20-2007 06:00
awk script para dividir um arquivo com base na condição superprogrammer Programação Shell Script e 12 06-14-2005 04:59

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
Linkback Thread Tools Pesquisar este Thread Avaliação: Thread Rating: 2 votes, 4.50 average. Display Modes
  #1 (permalink)  
Old 09-30-2008
shankster shankster is offline
Usuário
  
 

Join Date: Sep 2008
Posts: 3
Split File Baseada em Linha Número Padrão

Olá todos.

Desculpe, eu sei essa pergunta é semelhante a muitos outros, mas eu só posso parecem juntos exatamente o que eu preciso.

O meu arquivo é delimitted guia e contém cerca de 1 milhão de linhas. Gostaria de enviar linhas 1,4, e 7 para um arquivo. Linhas 2, 5, & 8 para um segundo arquivo. As linhas 3, 6, e 9 para um terceiro arquivo e, em seguida, linha 10 para quarto arquivo. Então, quero repetir essa condição, utilizando o mesmo cenário, e os mesmos quatro arquivos acima. Qualquer reflexão sobre a melhor abordagem?
  #2 (permalink)  
Old 09-30-2008
joeyg's Avatar
joeyg joeyg is offline Forum Staff  
Modérateur
  
 

Join Data: dezembro 2007
Localização: Home, de 17 de tempo de campeão mundial de Boston Celtics
Posts: 1.311
Cool Tenho de começar a resolver este

Mas, vou precisar de alguma ajuda awk (ou de pensar um pouco mais claro após almoçar)

Código:
> cat big_file4
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
d stuff to 4 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
d stuff to 4 file
O que eu escrevi inicialmente não captura o arquivo linha de texto - e, quando eu acho que preciso de ajuda!
Código:
> cat -n big_file4 | awk '{printf "%1s %-15s \n", substr($1,length($1),1), $2}'
1 a               
2 b               
3 c               
4 a               
5 b               
6 c               
7 a               
8 b               
9 c               
0 d               
1 a               
2 b               
3 c               
4 a               
5 b               
6 c               
7 a               
8 b               
9 c               
0 d
Porque a partir daqui, a minha teoria é que

Código:
grep "^[147] " <infile >outfile_a
grep "^[258] " <infile >outfile_b
grep "^[369] " <infile >outfile_c
grep "^[0] " <infile >outfile_d
Maio preciso cortar antes de escrever para cada saída.
  #3 (permalink)  
Old 09-30-2008
era era is offline Forum Advisor  
Herder do Inútil Gatos (On Sabático)
  
 

Join Date: Mar 2008
Localização: / lá / é / só / bin / sh
Posts: 3.652
Perl ou Python looping ao longo de um conjunto de file handles afigura como a mais eficiente i abordagem. Para uma solução mais pedestre, um awk script executado quatro vezes com diferentes parâmetros poderia ser aceitável, mesmo se o arquivo for grande.

O arquivo contém apenas quatro cada dez linhas e, em seguida, 11, 14 e 17 vão para o primeiro arquivo novamente?

Código:
perl -MIO::File -ne 'BEGIN { map { $file[$_] = IO::File->new(">file$_") || die $!} 0..3; 
  @m = (0, 1, 2, 0, 1, 2, 0, 1, 2, 3);
}
$file[$m[$. % 9]]->print || die $!'
csplit tem algumas opções bastante versátil, você pode ser capaz de puxar isto simplesmente com uma adequada csplit bem como padrão.

Última edição por época; em 09/30/2008 01:56.. Motivo: csplit nota
  #4 (permalink)  
Old 09-30-2008
shankster shankster is offline
Usuário
  
 

Join Date: Sep 2008
Posts: 3
Sim, 11,14 e 17, então vá para o primeiro arquivo novamente.

Estou tentando usar ksh para concluir esta tarefa. Abaixo está o que tenho até agora, mas a contagem variável parece não estar a repor a 1 depois de chegar 11. Além disso, estou obtendo resultados semelhantes para:

File_split_DC.sh [42]: 2: não foi encontrado.
File_split_DC.sh [42]: 3: não foi encontrado.
File_split_DC.sh [42]: 4: não foi encontrado.

O nome do meu script é "File_split_DC.sh"

#! / usr / bin / ksh

count \u003d 1

enquanto lê linha
fazer

no caso $ count
1)
echo "$ line">> RT1.txt
;
2)
echo "$ line">> RT2.txt
;
3)
echo "$ line">> RT3.txt
;
4)
echo "$ line">> RT1.txt
;
5)
echo "$ line">> RT2.txt
;
6)
echo "$ line">> RT3.txt
;
7)
echo "$ line">> RT1.txt
;
8)
echo "$ line">> RT2.txt
;
9)
echo "$ line">> RT3.txt
;
10)
echo "$ line">> RT4.txt
;
esac
((Count + \u003d 1))

se $ count-gt 10, então
count \u003d 1

fi
feito <My_Test.txt

exit 0
  #5 (permalink)  
Old 09-30-2008
joeyg's Avatar
joeyg joeyg is offline Forum Staff  
Modérateur
  
 

Join Data: dezembro 2007
Localização: Home, de 17 de tempo de campeão mundial de Boston Celtics
Posts: 1.311
Wink O que é isso?

Código:
> cat -n big_file4 | awk '{printf "%1s %-100s \n", substr($1,length($1),1), $0}' | cut -c1,10- | grep "^[147]" | cut -c2- >filea
> cat -n big_file4 | awk '{printf "%1s %-100s \n", substr($1,length($1),1), $0}' | cut -c1,10- | grep "^[258]" | cut -c2- >fileb
> cat -n big_file4 | awk '{printf "%1s %-100s \n", substr($1,length($1),1), $0}' | cut -c1,10- | grep "^[369]" | cut -c2- >filec
> cat -n big_file4 | awk '{printf "%1s %-100s \n", substr($1,length($1),1), $0}' | cut -c1,10- | grep "^[0]" | cut -c2- >filed
Código:
> cat big_file4
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
d stuff to 4 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
d stuff to 4 file
e agora os quatro arquivos separados
Código:
> cat filea
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
> cat fileb
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
> cat filec
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
> cat filed
d stuff to 4 file                                                                             
d stuff to 4 file                                                                             
>
  #6 (permalink)  
Old 09-30-2008
era era is offline Forum Advisor  
Herder do Inútil Gatos (On Sabático)
  
 

Join Date: Mar 2008
Localização: / lá / é / só / bin / sh
Posts: 3.652
Você quer

Código:
if [ $count -gt 10 ]; then
Seria mais eficiente para abrir quatro descritores arquivo e depois imprimir a estes descritores, o aproxima da Perl Eu abordagem sugerida acima.

Código:
exec 1>rt1.txt 2>rt2.txt 3>rt3.txt 4>rt4.txt
count=1
while read line; do
  case $count in
    1|4|7) print "$line" >&1;;
    2|5|8) print "$line" >&2;;
    3|6|9) print "$line" >&3;;
    10) print "$line" >&4; count=0;;
  esac
  count=`expr $count + 1`
done <My_Test.txt
Observe o uso do imprimir em vez de echo - Esta é ksh-específico, mas que não seja, esse script deve ser portátil.

Última edição por época; em 09/30/2008 02:15.. Motivo: Nota imprimir vs echo
  #7 (permalink)  
Old 09-30-2008
shankster shankster is offline
Usuário
  
 

Join Date: Sep 2008
Posts: 3
Graças a tanto de você para a sua entrada. Eu realmente não sei o que estou fazendo, quando se trata de UNIX, para que eu tente peça tidbits juntos. Acabei usando a abordagem da EEI na segunda colocação. Foi semelhante ao que eu já tinha colocado em conjunto, e faz sentido. JOEYG, eu tenho certeza que a sua abordagem iria funcionar tão bem, e eu aprecio o seu contributo.
Closed Thread

Marcadores

Tags
dividida pelo número linha, split para arquivos

Thread Tools Pesquisar este Thread
Pesquisar este Thread:

Pesquisa Avançada
Display Modes Esta taxa Thread
Esta taxa Thread:

Destacamento Regimento
Você não pode postar novas threads
Você não pode postar respostas
Você não pode postar anexos
Você não pode editar suas postagens

BB code é Ligado
Smilies são Ligado
[IMG] código é Ligado
Código HTML é Desligado
Trackbacks são Ligado
Pingbacks são Ligado
Refbacks são Ligado




Todos os horários são GMT -4. A hora é agora 11:13.


Powered by: vBulletinCopyright © 2000 - 2006, Jelsoft Enterprises Limited. Língua Traduções Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
O UNIX e Linux Fóruns Content Copyright © 1993-2009. Todos os Direitos Reserved.Ad Gestão por RedTyger

Content Relevant URLs por vBSEO 3.2.0