SED COMO EDITAR VÁRIAS LINHAS SIMULTÂNEAMENTE [RESOLVIDO]

1. SED COMO EDITAR VÁRIAS LINHAS SIMULTÂNEAMENTE [RESOLVIDO]

Carlos Eduardo Buss
buss

(usa Ubuntu)

Enviado em 27/01/2016 - 04:32h

Olá Fellas!

Estou tentando criar uma script para automatizar a formatação de 12 arquivos de aproximadamente 1 GB. Poderia fazer com o comando "vim", mas é muito trabalhoso e suscetíveis a erros.
Estas são os caracteres a serem substituídos:

Exemplos começo de linhas
x NE001357 0 0 1 -9 >> x NE001357 -9 -9 1 -9
x NE001358 0 0 1 -9 >> x NE001358 -9 -9 1 -9
x NE001359 0 0 1 -9 >> x NE001359 -9 -9 1 -9
x NE001360 0 0 1 -9 >> x NE001360 NE009990 78 1 2.2
x NE001361 0 0 1 -9 >> x NE001361 NE009980 478 1 3.4
x NE001362 0 0 1 -9 >> x NE001362 NE009911 23 1 6.1

Utilizei a seguinte sintaxe:
Substituir "foo" por "bar" somente as linhas que contém "plop"
sed '/plop/ s/foo/bar/g'

Formei o seguinte script:

sed '/NE001357/ 's/0 0 1 -9/-9 -9 1 -9/g' all_359.ped >> all_o

Este funcionou certinho para formatar a primeira linha, porém
qdo extrapolo para executar vários comandos ao mesmo tempo não funciona...

sed '/NE001357/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001358/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001359/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001360/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001361/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001362/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o

Eu gostaria de formatar todas as minhas 359 linhas ao mesmo tempo, sem formar um monte de arquivos intermediários.
Alguma ideia?

Abraços!

Carlos.





  


2. MELHOR RESPOSTA

Bruno Ricardo Rodrigues
Brunorr

(usa CentOS)

Enviado em 27/01/2016 - 13:46h

Bom dia, Bruno... Vou testar! Sabe me dizer como ficaria a sintaxe da linha de comando?

sed '/NE001357/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001358/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001359/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001360/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001361/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001362/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o

Obrigado.


Vamos fazer de um jeito mais prático.
Imagine que o arquivo que contem todas as linhas é o "all_t".

sed '/NE001357/ s/0 0 1 -9/-9 -9 1 -9/g' all_t | sed '/NE001358/ s/0 0 1 -9/-9 -9 1 -9/g' | sed '/NE001359/ s/0 0 1 -9/-9 -9 1 -9/g' | sed '/NE001360/ s/0 0 1 -9/-9 -9 1 -9/g' | sed '/NE001361/ s/0 0 1 -9/-9 -9 1 -9/g' | sed '/NE001362/ s/0 0 1 -9/-9 -9 1 -9/g' > novo_arquivo


O que acontece ali é que no primeiro sed ele pega o arquivo, altera o que se encaixa na mascara, ai ele redireciona a saída já modificada para o segundo sed, que varre o arquivo novamente atras do proximo padrão e altera, e assim vai ate passar por todos os sed. Caso queira adicionar mais alterações basta adicionar mais " | ".

abs :)


3. Re: SED COMO EDITAR VÁRIAS LINHAS SIMULTÂNEAMENTE [RESOLVIDO]

Bruno Ricardo Rodrigues
Brunorr

(usa CentOS)

Enviado em 27/01/2016 - 08:30h

Acredito que o que vc quer é que ele execute todos os comandos mas não altere a ordem no arquivo de origem. O que você pode fazer é utilizar o parâmetro "w" do comando sed. com este parâmetro você não precisa redirecionar a saída (>>) pois o comando substitui no próprio arquivo

NÃO ESQUEÇA DE FAZER BACKUP DO ARQUIVO ANTES


Dica: http://br.ccm.net/faq/8760-sed-introducao-ao-sed-part-i



4. RESP:

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 27/01/2016 - 09:24h

Bom dia Carlos.
As linhas sempre iniciam com: NE001357
Duas letras e seis números?

cat TST_buss.txt
NE001357 0 0 1 -9
NE001358 0 0 1 -9
NE001359 0 0 1 -9
NE001360 0 0 1 -9
NE001361 0 0 1 -9
NE001362 0 0 1 -9


É isso que quer na saída?
NE001357-9-9 1 -9
NE001358-9-9 1 -9
NE001359-9-9 1 -9
NE001360-9-9 1 -9
NE001361-9-9 1 -9
NE001362-9-9 1 -9


Att.:
Marcelo Oliver


5. Re: SED COMO EDITAR VÁRIAS LINHAS SIMULTÂNEAMENTE

Carlos Eduardo Buss
buss

(usa Ubuntu)

Enviado em 27/01/2016 - 11:02h

Bom dia, MOLIVER.

Esté um arquivo binário .PED, output do software plink. Sendo que este cabeçalho que quero editar serve para identificar e adicionar informações a cada linha.

Todos os IDS são NE00xxxx (cada linha tem por este código uma identificação diferente).

as Linhas de origem estão nomeadas desta forma:

NE00xxxx 0 0 1 -9

Preciso substitui-las para caracteres númericos e alfanúmericos.
Por exemplo:

NE00xxxx -9 -9 1 -9

ou

NE00xxx NE1334 12354 1 2.34



6. Re: SED COMO EDITAR VÁRIAS LINHAS SIMULTÂNEAMENTE [RESOLVIDO]

Carlos Eduardo Buss
buss

(usa Ubuntu)

Enviado em 27/01/2016 - 11:09h

Brunorr escreveu:

Acredito que o que vc quer é que ele execute todos os comandos mas não altere a ordem no arquivo de origem. O que você pode fazer é utilizar o parâmetro "w" do comando sed. com este parâmetro você não precisa redirecionar a saída (>>) pois o comando substitui no próprio arquivo

NÃO ESQUEÇA DE FAZER BACKUP DO ARQUIVO ANTES


Dica: http://br.ccm.net/faq/8760-sed-introducao-ao-sed-part-i

Bom dia, Bruno... Vou testar! Sabe me dizer como ficaria a sintaxe da linha de comando?

sed '/NE001357/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001358/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001359/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001360/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001361/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o
sed '/NE001362/ s/0 0 1 -9/-9 -9 1 -9/g' all_t >> all_o

Obrigado.



7. Re: SED COMO EDITAR VÁRIAS LINHAS SIMULTÂNEAMENTE

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 27/01/2016 - 11:46h

buss escreveu:

Bom dia, MOLIVER.

Esté um arquivo binário .PED, output do software plink. Sendo que este cabeçalho que quero editar serve para identificar e adicionar informações a cada linha.

Todos os IDS são NE00xxxx (cada linha tem por este código uma identificação diferente).

as Linhas de origem estão nomeadas desta forma:

NE00xxxx 0 0 1 -9

Preciso substitui-las para caracteres númericos e alfanúmericos.
Por exemplo:

NE00xxxx -9 -9 1 -9

ou

NE00xxx NE1334 12354 1 2.34


buss escreveu:

Bom dia, MOLIVER.

Esté um arquivo binário .PED, output do software plink. Sendo que este cabeçalho que quero editar serve para identificar e adicionar informações a cada linha.

Todos os IDS são NE00xxxx (cada linha tem por este código uma identificação diferente).

as Linhas de origem estão nomeadas desta forma:

NE00xxxx 0 0 1 -9

Preciso substituí-las para caracteres numéricos e alfanuméricos.
Por exemplo:

NE00xxxx -9 -9 1 -9

ou

NE00xxx NE1334 12354 1 2.34

###################################################################################################
Bom dia buss.
OK, todas linhas começam com:
NE00xxxx
A variação ocorrerá somente nos xxxx e NE00 sempre fixo, é isso?
Sendo assim, a seguinte REGEX => NE00[0-9]\{4\} casa
Veja:
sed '/NE00[0-9]\{4\}/s/ 0/-9/g' TST_buss.txt  

NE001357-9-9 1 -9
NE001358-9-9 1 -9
NE001359-9-9 1 -9
NE001360-9-9 1 -9
NE001361-9-9 1 -9
NE001362-9-9 1 -9

No exemplo que você postou, depois de NE00xxx, é sempre 0 0 1 -9.
É sempre assim mesmo, não há variação?

No aguardo,
Marcelo Oliver








8. Re: SED COMO EDITAR VÁRIAS LINHAS SIMULTÂNEAMENTE [RESOLVIDO]

Carlos Eduardo Buss
buss

(usa Ubuntu)

Enviado em 27/01/2016 - 12:26h

Olá amigo.

O único problema é que NE00xxxx está na segunda coluna!

Ex: 14 NE00xxxx NE001383 4428 1 4.46




9. Deu certo!

Carlos Eduardo Buss
buss

(usa Ubuntu)

Enviado em 28/01/2016 - 15:24h

Olá Galera, consegui resolver a pendenga!!!

Vou dar o feedback ...

Seguinte o que estava dando pau era porque o "SED" só altera um caractere por vez, além disso,
eu tinha adicionado o g' no final isso tava multiplicando o tamanho do arquivo:

Ex do arquivo errado: sed '/IMAP5069/ s/ 0 0 1 -9/2222 3333 4444 555/g' arq_input <arq_saida

Vejam, não solucionei da maneira mais inteligente, mas da qual estava ao meu alcance: eu preciso formatar 12 arquivos, eu formatei o primeiro com o comando "VIM",
os 11 restantes o que muda do arquivo formatado primeiramente é só uma coluna.

Assim eu formei um script para editar somente uma coluna das quase 400 linhas dos 11 arquivos restantes:


sed '/IMAP5069/ s/1.60/36.57/' all_ge_backup |
sed '/IMAP5072/ s/1.60/35.50/' |
sed '/NE001403/ s/6.24/46.90/' |
sed '/NE001407/ s/3.24/53.50/' |
sed '/NE001408/ s/1.83/54.10/' |
sed '/NE001413/ s/3.03/48.90/' |
sed '/NE001416/ s/1.57/42.80/' |
sed '/NE001420/ s/3.82/50.10/' |
sed '/NE001423/ s/2.44/58.40/' |
sed '/NE001426/ s/3.09/47.20/' |
sed '/NE001427/ s/5.14/56.90/' |
sed '/NE001428/ s/5.58/54.70/' |
sed '/NE001429/ s/4.98/55.10/' |
sed '/NE001430/ s/2.96/51.30/' |
sed '/NE001438/ s/2.74/51.40/' |
sed '/NE001439/ s/3.38/53.60/' |
sed '/NE001440/ s/3.02/48.80/' |
sed '/NE003843/ s/2.20/40.57/' |
sed '/NE003845/ s/1.60/39.77/' |
sed '/NE003846/ s/1.60/33.80/' |
sed '/NE003961/ s/1.60/45.10/' > all_testsed

Gostaria de agradecer o MOLIVER e o Brunorr que se dedicaram para me ajudar a resolver o problema, economizarei uma semana de trabalho com este script! Valeu rapaziada!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts