Eu tenho um arquivo de texto onde o número da coluna e da linha sempre varia e desejo remover linhas inteiras do arquivo txt somente se cada coluna dentro dele for igual a $VAR1 ou $VAR2. Por exemplo:
Digamos $VAR1="X" e $VAR2="N" e quero remover qualquer linha onde $VAR1 e $VAR2 constituem a coluna inteira.
Esta seria minha entrada:
hajn 32 ahnnd namm 5 543 asfn F
X X N X X X N X
5739 dw 32eff Sfff 3 asd 3123 1
E esta seria minha saída desejada:
hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1
Posso resolver isso com um loop, mas queria saber se existe uma maneira poderosa de fazer isso, de preferência awk.
Responder1
$ VAR1=N
$ VAR2=X
$ awk -v a="$VAR1" -v b="$VAR2" '{ for (i=1; i<=NF; ++i) if ($i != a && $i != b) { print; next } }' file
hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1
Aqui, transferimos os valores $VAR1
e $VAR2
para nosso awk
script curto e suas variáveis a
e usando a linha de comando.b
-v
Dentro do awk
script, iteramos sobre os campos de cada linha e, se algum campo for diferente de e a
do b
valor, imprimimos a linha completa e continuamos com a próxima linha imediatamente.
Se nenhum campo for diferente de a
e b
, nada acontece (a linha não é impressa).
Responder2
Você poderia obter os resultados desejados com a escolha certa de regex. Nota: supondo que as variáveis do shell tenham caracteres insípidos, ou seja, aqueles que não são interpretáveis como especiais de regex. Caso isso não seja verdade, você pode revestir os vars no \Q...\E
contexto.
$ grep -P "(^|\s)(?!$VAR1(\s|\$))(?!$VAR2(\s|\$))" inp