Inverter comando [RESOLVIDO]

1. Inverter comando [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 19/01/2019 - 15:01h

Pessoas ... isso eu mostro o intervalo:
awk 'BEGIN{RS="\n\n"} /'$VAR'/ {print $0}' txt.txt 


Pergunta:
Como inverto isso, ou seja, exibir tudo, menos esse intervalo ???




  


2. MELHOR RESPOSTA

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 19/01/2019 - 16:17h

Pois então. Eu até testei esse exemplo que você colocou e funcionou perfeitamente. Bom, só teve uma diferença que foi essa linha vazia entre o primeiro e o segundo bloco, o que resolvi usando a variável ORS:

awk 'BEGIN{RS="\n\n";ORS="\n\n"} /'$VAR'/ {next} {print $0}' txt.txt 


Qual saída você está recebendo? Já verificou se a variável está mesmo com o valor que você precisa?

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/

3. Re: Inverter comando [RESOLVIDO]

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 19/01/2019 - 15:25h

Não sei se entendi direito o que você precisa, mas acho que você quer dizer o seguinte:

"Como mostrar todas as linhas que não casam com a expressão regular que eu passei?"

Se é isso, eu tenho uma boa e uma má notícia. A má é que AWK não oferece um mecanismo padrão pra negar uma expressão regular ou inverter os resultados. A boa é que isso é perfeitamente contornável, usando o comando next. Veja:

awk 'BEGIN{RS="\n\n"} /'$VAR'/ {next} {print $0}' txt.txt  


Isso vai fazer com que todas as vezes que sua expressão regular for encontrada, ela seja ignorada. Em seguida vem o comando print, que será usado para todas as outras linhas.

Porém, se quiser algo mais simples, pode recorrer ao grep com a opção "-v", que faz esse papel da inversão do resultado. Ele vai buscar todas as linhas que não casam com a expressão regular informada.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


4. Re: Inverter comando [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 19/01/2019 - 15:31h


hrcerq escreveu:

Não sei se entendi direito o que você precisa, mas acho que você quer dizer o seguinte:

"Como mostrar todas as linhas que não casam com a expressão regular que eu passei?"


Não é isso que preciso ... aquele comando me retorna um bloco ( separados por linha em branco ) de linhas que entre elas está a $VAR, eu quero é que esse bloco seja "NÃO MOSTRADO" ... sacou aí ... que inverter( ou negar ) o comando.

------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------




5. Re: Inverter comando [RESOLVIDO]

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 19/01/2019 - 15:38h

Ah, sim, é verdade. Está separado por blocos. Mas mesmo assim o comando awk que passei, usando next resolveria. Só o grep que não, porque atuaria em linhas. Se ainda assim não é isso que você precisa, vou precisar que você poste aqui uma amostra do arquivo e do resultado que precisa pra facilitar o entendimento do problema.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


6. Re: Inverter comando [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 19/01/2019 - 15:52h

Seu comando não resolve velho ... eu tenho a variável em apenas uma linha do bloco e é sempre a 1ª ... então eu preciso excluir essa linha até a próxima linha vazia.

Vou te dar um exemplo do que preciso


1
2
3

a
b
c
d

!
@
#
$
%


VAR="a" ### essa variável sempre vai estar na 1ª linha so bloco.

Saída desejada

1
2
3

!
@
#
$
%



------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------




7. Re: Inverter comando [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 19/01/2019 - 17:09h

hrcerq escreveu:

Pois então. Eu até testei esse exemplo que você colocou e funcionou perfeitamente. Bom, só teve uma diferença que foi essa linha vazia entre o primeiro e o segundo bloco, o que resolvi usando a variável ORS:

awk 'BEGIN{RS="\n\n";ORS="\n\n"} /'$VAR'/ {next} {print $0}' txt.txt 



Esse ORS resolveu o problema, estava excluindo todas as linhas em branco ...

Mais duas coisas ..

1 - Explica esse AWK seu pra gente entender !!!
2 - Tem um parâmetro para modificar o arquivo, qual é ele que não lembro ???

------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------




8. Re: Inverter comando [RESOLVIDO]

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 19/01/2019 - 17:38h

Mauriciodez escreveu:

[...]

Esse ORS resolveu o problema, estava excluindo todas as linhas em branco ...

Mais duas coisas ..

1 - Explica esse AWK seu pra gente entender !!!


Bom, eu acho que já expliquei a parte do next. Mas vou detalhar um pouco mais:

Em awk, como você deve saber, você pode listar uma ou mais expressões regulares, e as ações que serão aplicadas para cada uma. Cada linha (ou melhor, cada registro, pois o delimitador do registro pode variar, como ocorreu no seu caso) vai ser lida em sequência, e se ela bater com alguma regra (alguma das expressões regulares), aquela ação será aplicada.

Se uma linha bater com mais de uma regra, as ações de cada regra serão aplicadas para aquela linha. Aí entra o comando next. Se o comando next é chamado, então as regras seguintes não são aplicadas para aquele registro. Em vez disso, o próximo registro será lido.

A ausência de expressões regulares significa que o registro será processado independente do que ele tiver. Então o comando print usado em seguida será aplicado para todos os registros (menos aqueles que passaram primeiro pela regra do $VAR e consequentemente chamaram next).

Sobre o ORS, essa variável serve pra definir o delimitador de registros do output do programa, diferente do RS que define o delimitador de registros do input. Pra que a saída não concatenasse tudo, tive que incluir essa regra.

2 - Tem um parâmetro para modificar o arquivo, qual é ele que não lembro ??? [...]


O AWK não modifica os arquivos de input. Ele apenas processa e gera uma saída. Pra modificar, você poderia usar o sed (se usar a opção -i ele altera o arquivo em vez de gerar uma saída nova).

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


9. Re: Inverter comando [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 19/01/2019 - 18:19h

hrcerq escreveu:
O AWK não modifica os arquivos de input. Ele apenas processa e gera uma saída. Pra modificar, você poderia usar o sed (se usar a opção -i ele altera o arquivo em vez de gerar uma saída nova).


O Marcelo uma vez postou uma parada com AWK para modificar o arquivo ... só não lembro se era com o AWK mesmo ou era o inplace do GAWK !!


------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------




10. Re: Inverter comando [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/01/2019 - 18:26h


Mauriciodez escreveu:

Pessoas ... isso eu mostro o intervalo:
awk 'BEGIN{RS="\n\n"} /'$VAR'/ {print $0}' txt.txt 


Pergunta:
Como inverto isso, ou seja, exibir tudo, menos esse intervalo ???



Mauricio, use a "negação" na REGEX "!~"
Segue:
awk 'BEGIN{RS="\n\n"} $1!~/'$VAR'/ {print $0"\n"}' texto.txt 



11. Re: Inverter comando [RESOLVIDO]

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 19/01/2019 - 18:31h

Mauriciodez escreveu:

hrcerq escreveu:
O AWK não modifica os arquivos de input. Ele apenas processa e gera uma saída. Pra modificar, você poderia usar o sed (se usar a opção -i ele altera o arquivo em vez de gerar uma saída nova).


O Marcelo uma vez postou uma parada com AWK para modificar o arquivo ... só não lembro se era com o AWK mesmo ou era o inplace do GAWK !!


------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------



Até onde sei, não existe opção in-place para o GAWK. Para o SED sim, existe essa opção (-i). Procurei no man-page do gawk e não vi nada a respeito. Porém, se existe essa opção eu gostaria muito de saber também qual é. De toda forma, nada impede que você faça isso manualmente, gerando um arquivo temporário e depois movendo esse arquivo para sobrescrever a versão antiga.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


12. Re: Inverter comando [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 19/01/2019 - 18:32h


msoliver escreveu:

Mauricio, use a "negação" na REGEX "!~"
Segue:
awk 'BEGIN{RS="\n\n"} $1!~/'$VAR'/ {print $0"\n"}' texto.txt 


Agora ????

Acabei de marcar a melhor resposta e vc chega com a solução que eu procurava ???

A negação é $1!~ ou !~ ?? pq tirei o $1 e não funcionou ??


@hrcerq --- a opção do GAWK é "-i inplace"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------





01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts