Remover linhas simultaneamente em dois arquivos [RESOLVIDO]

25. Re: Remover linhas simultaneamente em dois arquivos [RESOLVIDO]

Roberto Vasconcelos Melo
rvmelo

(usa Outra)

Enviado em 01/11/2018 - 18:38h

msoliver escreveu:

rvmelo escreveu:

msoliver escreveu:

Boa tarde RvMelo.
Estou verificando.
A var 'str' tem 476 linhas . . .
Estou pensando em uma solução...

EDITADO as 17:20h
Segue a solução:

#/bin/bash
C1="\e[0;38;5;226m"
C2="\e[0;38;5;2m"
C3="\e[0;38;5;39m"
str=$(sort ARQ1|uniq -d)

while read -r line;do
FNR=$(awk '/'"${line}"'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//');
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2;
echo -e "\n${C1} Valor das Variáveis:\n${C2} STR: ${line} \n${C3} FNR: ${FNR}\x1B[m";
done <<< "$str"

att.:
Marcelo Oliver


rvmelo escreveu:

meu código ficou da seguinte forma:

#!/bin/bash

str=$(sort test.txt|uniq -d)
FNR=$(awk '/'"${str}"'/ {printf "FNR==%s||" ,NR}' test.txt|sed 's/||$//')
awk -i inplace '{if ('${FNR}') ;else print $0}' test.txt alert_data.txt

echo "valor de str: "
echo $str


Muito obrigado funcionou sim!! Mas uma pergunta só pra ter certeza... nos dois arquivos caso seja alterado a ordem das linhas em um arquivo no outro também é preciso alterar, pois são linhas correspondentes.

Por exemplo ARQ1:

ID: 1
ID: 2
ID: 3
ID: 4


ARQ2:


1,1,1,1,1,1,normal
2,2,2,2,2,2,normal
3,3,3,3,3,3,normal
4,4,4,4,4,4,anomaly


Se eu alterar ARQ2 de forma que fique assim:

4,4,4,4,4,4,anomaly
2,2,2,2,2,2,normal
3,3,3,3,3,3,normal
1,1,1,1,1,1,normal


Então ARQ1 precisa ficar assim:

ID: 4
ID: 2
ID: 3
ID: 1


E vice versa se for o oposto. Essa regra foi mantida? Obrigado!!


Boa tarde RVMelo.
O script, sequencia de comandos....
Foi feito considerando uma relação entre os dois arquivos....
Caso os arquivos não tenham essa "relação"..... não vai funcionar.
Veja bem:
O comando:
sort arquivo1|uniq -d => Ordena o arquivo e "pega" somente o conteúdo das linhas repetidas.
O comando:
awk '/'"${str}"'/ {printf "FNR==%s||" ,NR}' arquivo1|sed 's/||$//' => Pega o Número das Linhas repetidas e monta o "condicional"
Em tempo, os dois comandos acima baseiam-se somente em um dos arquivos.
Já o comando:
awk -i inplace '{if ('${FNR}') ;else print $0}' arquivo1 arquivo2 => Imprime somente as linhas de ambos arquivos que não casam com o condicional.
Conclusão:
Se a ordem das linhas não coincidirem nos arquivos, você deve "duplicar" os comandos, fazer um para cada arquivo, separadamente.
Exemplo:
str1=$(sort test.txt|uniq -d)
NR1=$(awk '/'"${str}"'/ {printf "NR==%s||" ,NR}' test.txt|sed 's/||$//')
awk -i inplace '{if ('${NR1}') ;else print $0}' test.txt

str2=$(sort alert_data.txt|uniq -d)
NR2=$(awk '/'"${str}"'/ {printf "NR==%s||" ,NR}' alert_data.txt|sed 's/||$//')
awk -i inplace '{if ('${NR2}') ;else print $0}' alert_data.txt


Obs.: Se a variável "str" tiver mais de uma linha, use a opção:
while read -r line;do
FNR=$(awk '/'"${line}"'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//');
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2;
echo -e "\n${C1} Valor das Variáveis:\n${C2} STR: ${line} \n${C3} FNR: ${FNR}\x1B[m";
done <<< "$str"

É ISSO...
Marcelo Oliver


Muito obrigado!! Eu testei aqui com uma versão menor dos arquivos e os dois arquivos mantiveram sim a correspondência entre eles. Estava preocupado com isso mas eles mantiveram a correspondência.




  



01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts