CORTAR COLUNAS COM AWK

1. CORTAR COLUNAS COM AWK

MARCOS
gellox

(usa Outra)

Enviado em 25/05/2012 - 14:01h

Pessoal estou precisando de uma ajuda.

Tenho um arquivo muito grande e gostaria de cortar por colunas.

olhem o arquivo:


123456789012345678901234567890123456789012345678901234567890
098765432109876543210987654321098765432109876543210987654321
654321098765432109876543210987654321098765432109876543215646
321098765432109876543210987654321098765432109876543214535445
098765432109876543210987654321098765432109876543213543545435
543210987654321098765432109876543210987654321098765432178798
098765432109876543210987654321098765432167545468784444548454
654321098765432109876543210987654321098765432109876543214543
987654321098765432109876543210987654321098765432165454545435
876543210987654321098765432109876543210987654321784312413543
098765432109876543210987654321098765432109876543215435484344

posso fazer isso com o cut ( cut -c 10-20)
mas queria fazer isso com awk ou pearl, pois acho que ficaria mais rápido,
com o cut devido ao tamanho do arquivo demora muito.

Obrigado desde já pela ajuda.


  


2. Re: CORTAR COLUNAS COM AWK

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 25/05/2012 - 14:07h

gellox escreveu:

Pessoal estou precisando de uma ajuda.

Tenho um arquivo muito grande e gostaria de cortar por colunas.

olhem o arquivo:


123456789012345678901234567890123456789012345678901234567890
098765432109876543210987654321098765432109876543210987654321
654321098765432109876543210987654321098765432109876543215646
321098765432109876543210987654321098765432109876543214535445
098765432109876543210987654321098765432109876543213543545435
543210987654321098765432109876543210987654321098765432178798
098765432109876543210987654321098765432167545468784444548454
654321098765432109876543210987654321098765432109876543214543
987654321098765432109876543210987654321098765432165454545435
876543210987654321098765432109876543210987654321784312413543
098765432109876543210987654321098765432109876543215435484344

posso fazer isso com o cut ( cut -c 10-20)
mas queria fazer isso com awk ou pearl, pois acho que ficaria mais rápido,
com o cut devido ao tamanho do arquivo demora muito.

Obrigado desde já pela ajuda.


Você tem razão, o cut é o mais lento da família fatiadora. Se a questão é velocidade, o awk embora seja um canivete suiço é lento para isso.

Em todos os testes que já fiz para casos de arquivos grandes e blocos o sed é o campeão. Claro que se fosse para pegar a 1ª linha iria usar o head, se for para pegar as últimas linhas usaria o tail, e assim vai.

Para esse trabalho que vc quer, use sed

Editado: 14:10
Veja este ótimo tutorial: http://rberaldo.com.br/o-comando-sed-do-linux/





3. Re: CORTAR COLUNAS COM AWK

MARCOS
gellox

(usa Outra)

Enviado em 25/05/2012 - 14:12h

Obrigado pelo retorno, mas eu quero fazer em todo o arquivo e não só em uma linha, lembrando que em algumas linhas eu também tenho espaço,
ou seja se eu fizer um for ou while pode dar problemas quando encontrar o espaço, eu preciso separa realmente por coluna independente dessa coluna cobnter espaço ou não.

poderia me dar um exemplo de como fazer?


4. Re: CORTAR COLUNAS COM AWK

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 25/05/2012 - 14:18h

gellox escreveu:

Obrigado pelo retorno, mas eu quero fazer em todo o arquivo e não só em uma linha, lembrando que em algumas linhas eu também tenho espaço,
ou seja se eu fizer um for ou while pode dar problemas quando encontrar o espaço, eu preciso separa realmente por coluna independente dessa coluna cobnter espaço ou não.

poderia me dar um exemplo de como fazer?


OK. Veja este vídeo que é muito legal também.




Se entendi corretamente, você que passar ao comando posição inicial e posição final certo ?
Se variar as posições aí vamos ter que ver outra forma.




5. Re: CORTAR COLUNAS COM AWK

MARCOS
gellox

(usa Outra)

Enviado em 25/05/2012 - 14:23h

Vlw pela resposta novamente,

quanto ao video não tenho como ver estou no trabalho e é bloqueado,
mas é isso mesmo quero pegar em todo o arquivo e em cada linha a posição 10 até a 20 por exemplo
como se fizesse um cut -c 10-20 para cada linha, pq ai não vai me interessar se na linha tem ou não espaço.


6. Re: CORTAR COLUNAS COM AWK

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 25/05/2012 - 19:59h

gellox escreveu:

Vlw pela resposta novamente,

quanto ao video não tenho como ver estou no trabalho e é bloqueado,
mas é isso mesmo quero pegar em todo o arquivo e em cada linha a posição 10 até a 20 por exemplo
como se fizesse um cut -c 10-20 para cada linha, pq ai não vai me interessar se na linha tem ou não espaço.


ok.

Então para provar o funcionamento, alterei o seu bloco e assim conseguir visualizar.

Chamei este arquivo de texto.txt

1234567890xxxxxxxxxx1234567890123456789012345678901234567890
0987654321yyyyyyyyyy0987654321098765432109876543210987654321
6543210987zzzzzzzzzz6543210987654321098765432109876543215646
321098765432109876543210987654321098765432109876543214535445
098765432109876543210987654321098765432109876543213543545435
543210987654321098765432109876543210987654321098765432178798
1234567890xxxxxxxxxx1234567890123456789012345678901234567890
0987654321yyyyyyyyyy0987654321098765432109876543210987654321
6543210987zzzzzzzzzz6543210987654321098765432109876543215646
098765432109876543210987654321098765432167545468784444548454
654321098765432109876543210987654321098765432109876543214543
987654321098765432109876543210987654321098765432165454545435
1234567890xxxxxxxxxx1234567890123456789012345678901234567890
0987654321yyyyyyyyyy0987654321098765432109876543210987654321
6543210987zzzzzzzzzz6543210987654321098765432109876543215646
876543210987654321098765432109876543210987654321784312413543
098765432109876543210987654321098765432109876543215435484344
1234567890xxxxxxxxxx1234567890123456789012345678901234567890
0987654321yyyyyyyyyy0987654321098765432109876543210987654321
6543210987zzzzzzzzzz6543210987654321098765432109876543215646


Caso eu tenha entendido errado me avisa.
Marquei com xxxxx, yyyy e zzzzz a posição 11 até 20 e aí você poderá regular da forma que quiser.

O comando:


sed 's/.\{20\}/&§/ ; s/§.*// ; s/.\{10\}//'



Podem ter outras formas de fazer, mas foi assim que consegui resolver em 3 partes.
Para você medir a velocidade em um arquivo grande use antes o comando time


time sed 's/.\{20\}/&§/ ; s/§.*// ; s/.\{10\}//' < texto.txt


Fazendo assim vc terá o resultado na tela: Provando que funcionou e no final o tempo para você comparar com o cut ou awk


xxxxxxxxxx
yyyyyyyyyy
zzzzzzzzzz
3210987654
0987654321
5432109876
xxxxxxxxxx
yyyyyyyyyy
zzzzzzzzzz
0987654321
6543210987
9876543210
xxxxxxxxxx
yyyyyyyyyy
zzzzzzzzzz
8765432109
0987654321
xxxxxxxxxx
yyyyyyyyyy
zzzzzzzzzz
real 0m0.002s
user 0m0.000s
sys 0m0.000s


Não testei com o comando tr, mas suspeito que igual ao cut ou awk façam o mesmo loop dentro da linha na memória como o sed está fazendo.

Vou te explicar o que está acontecendo no comando.


sed

's/ = substituir
.\{20\}/&§/ ; = até a posição 20 adicionando um caracter especial. Neste caso § e o & faz retornar o que casou, 20 caracteres.
s/§.*// ; = substitua a partir do caracter especial § tudo por nada. Ou seja, remove tudo depois do danado.
s/.\{10\}//' = substitua as primeiras 10 posições por nada. Vai sobrar somente os 10 que você deseja.
< texto.txt = O arquivo que vc já tem salvo com o grande texto/bloco.


Caso vc queira gerar um arquivo de saída, faça no final > seuarquivo.txt

exemplo:

time sed 's/.\{20\}/&§/ ; s/§.*// ; s/.\{10\}//' < texto.txt > seuarquivo.txt


Se vc quiser a posição 15 até 35. É só mudar {20\} por {35\} e {10\} por {15\}

Sempre fiz este tipo de construção usando o bloco inteiro. Este ficou mais complicado porque precisei cortar o bloco que não interessa.
Caso a sua intenção seja de usar os 10 primeiros aí fica super fácil. Salve o resultado do que sobrou dos 10 primeiros e vá fazendo isso até acabar com todos eles.

Espero que tenha ajudado. ;)

Agora é bom estudar o sed porque ele é um canivete suiço tão bom quanto o awk



Detalhe: Por que o sed é mais rápido do que o cut ou awk ? Ele vai carregando o arquivo e processando a linha com o resultado. Os demais carregam o arquivo e só depois começam a aplicar os loops e gsub strings. Pelo menos foi a dedução que fiz.




7. Re: CORTAR COLUNAS COM AWK

MARCOS
gellox

(usa Outra)

Enviado em 28/05/2012 - 06:48h

Muito boa a explicação, inclusive uma excelente ideia de inserir o carácter especial, parabéns e obrigado pela ajuda

Abraços!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts