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.