Inverter comando [RESOLVIDO]

13. Re: Inverter comando [RESOLVIDO]

Hugo Cerqueira
hrcerq

(usa Outra)

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

Mauriciodez escreveu:


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 |------------------------------------------------------



Caramba, como não pensei nisso? Rsrsrs... Mas é sempre bom ver outras formas de resolver um problema. Nunca se sabe quando vai precisar delas.

Enfim, sobre a opção -i, ela funciona com sed. No Gawk, essa opção é usada pra carregar comandos de um arquivo externo no seu script.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


  


14. Re: Inverter comando [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

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


hrcerq escreveu:

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/

Boa noite Hugo.
Contrariando a sua afirmação...
O awk altera arquivos, requer o gawk instalado.
Segue:
awk -i inplace 'BEGIN{RS="\n\n"} $1!~/a/ {print $0"\n"}' texto 



15. Re: Inverter comando [RESOLVIDO]

Hugo Cerqueira
hrcerq

(usa Outra)

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

msoliver escreveu:


hrcerq escreveu:

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/

Boa noite Hugo.
Contrariando a sua afirmação...
O awk altera arquivos, requer o gawk instalado.
Segue:
awk -i inplace 'BEGIN{RS="\n\n"} $1!~/a/ {print $0"\n"}' texto 


Não conhecia esse inplace. Conhecia a opção -i. No caso, então inplace é uma biblioteca externa, carregada pra fazer o trabalho que seria manual, de gerar um termporário e depois sobrescrever, certo?

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


16. Re: Inverter comando [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

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

O comando final ficou

gawk -i inplace 'BEGIN{RS="\n\n";ORS="\n\n"} /'$VAR'/ {next} {print $0}' txt.txt 

ou
gawk -i inplace 'BEGIN{RS="\n\n"} $1!~/'$VAR'/ {print $0"\n"}' txt.txt 


NOTA: Então é por isso que não estava conseguindo fazer funcionar no awk o "-i inplace"... precisava do GAWK instalado, e acabei de instalar ele !!!


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

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

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




17. Re: Inverter comando [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

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

A negação é $1!~ ou !~ ?? pq tirei o $1 e não funcionou ??
a negação é:
$1 !~ /a/ #Campo um não casa com a regex


18. Re: Inverter comando [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

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

hrcerq escreveu:

msoliver escreveu:


hrcerq escreveu:

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/

Boa noite Hugo.
Contrariando a sua afirmação...
O awk altera arquivos, requer o gawk instalado.
Segue:
awk -i inplace 'BEGIN{RS="\n\n"} $1!~/a/ {print $0"\n"}' texto 


Não conhecia esse inplace. Conhecia a opção -i. No caso, então inplace é uma biblioteca externa, carregada pra fazer o trabalho que seria manual, de gerar um termporário e depois sobrescrever, certo?

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/

Boa noite Hugo, descobri o "inplace", no "Santo google", em uma ocasião que necessitei....
Você pode mudar a extensão do arquivo que sera alterado, veja + em:
https://www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inplace.html

Att.:
Marcelo Oliver


19. Re: Inverter comando [RESOLVIDO]

Hugo Cerqueira
hrcerq

(usa Outra)

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

msoliver escreveu:

[...]

Boa noite Hugo, descobri o "inplace", no "Santo google", em uma ocasião que necessitei....
Você pode mudar a extensão do arquivo que sera alterado, veja + em:
https://www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inplace.html

Att.:
Marcelo Oliver


Então é isso mesmo, uma extensão do gawk para suportar alterações inplace. Interessante, como dizem, a necessidade é a mãe do aprendizado.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


20. Re: Inverter comando [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 19/01/2019 - 23:47h

Ei pessoas .. deu um BO aqui, os comandos não aceitam $VAR composta, como resolvo ???

EDIT: No caso minha $VAR seria composta por uma string fixa e mais uma outra var digitada pelo usuário
VAR="String $NOME" 


A solução que encontrei foi inserir um SED para trocar "String " por "String_", aí no final do script altera de novo, logo se tivesse como o AWK identificar a $VAR composta seria o ideal !!!

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

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

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




21. Re: Inverter comando [RESOLVIDO]

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 20/01/2019 - 16:25h

Mauriciodez escreveu:

Ei pessoas .. deu um BO aqui, os comandos não aceitam $VAR composta, como resolvo ???

EDIT: No caso minha $VAR seria composta por uma string fixa e mais uma outra var digitada pelo usuário
VAR="String $NOME" 


A solução que encontrei foi inserir um SED para trocar "String " por "String_", aí no final do script altera de novo, logo se tivesse como o AWK identificar a $VAR composta seria o ideal !!!

[...]


Você pode resolver assim:

awk -v VAR="$VAR" -i inplace 'BEGIN{RS="\n\n";ORS="\n\n"} $0 ~ VAR {next} {print $0}' txt.txt 


Ou

awk -v VAR="$VAR" -i inplace 'BEGIN{RS="\n\n"} $0 !~ VAR {print $0"\n"}' txt.txt 


Nessa segunda opção troquei o $1 por $0 porque o separador padrão de colunas é qualquer tipo de espaço (tabulação, um ou mais espaços seguidos, etc.), e se o valor de $VAR contem espaços, então obviamente casar a expressão só com a primeira coluna não vai resolver. Mas você poderia mudar isso alterando o valor da variável FS para usar um outro separador de colunas, se fosse o caso.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts