Remover linhas simultaneamente em dois arquivos [RESOLVIDO]

1. Remover linhas simultaneamente em dois arquivos [RESOLVIDO]

Roberto Vasconcelos Melo
rvmelo

(usa Outra)

Enviado em 12/10/2018 - 15:42h

Então... eu sei que o comando "awk" pode remover linhas duplicadas de um arquivo... no entanto vamos supor que existem dois arquivos da seguinte forma:


I love you
jessyka
I love you
kate


O segundo arquivo da seguinte maneira:


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


Removendo as linhas "I love you" eu gostaria de remover as linhas correspondentes no segundo arquivo, por exemplo no segundo arquivo teria que remover a primeira e terceira linha, então os dois arquivos ficariam assim:


jessyka
kate


Já o segundo ficaria assim:


ID: 2
ID: 4


Como seria o script para realizar essa tarefa?


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 20/10/2018 - 13:29h

Boa tarde.
Peguei o erro....
Devido aos espaços na variável 'str', e necessário uma pequena alteração, segue:
FNR=$(awk '/'"${str}"'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')
Obs.: aspas simples / aspas simples aspas duplas ${str} aspas duplas aspas simples /

Se a RESPOSTA foi Satisfatória e sanou suas duvidas, marque o tópico como RESOLVIDO e a MiNHA resposta como a MELHOR....
Assim ganho uns pontinhos . . . Rsrsrsr

Att.:
Marcelo Oliver

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

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 13/10/2018 - 10:40h

Aqui vai uma "gambiarra" feita com meus parcos conhecimentos em shell script.
Com certeza alguém mais fera vai criar uma solução mais elegante... hehehe!!!
Adapte ao seu contexto:
#!/bin/bash

procura="laranja"
arquivo1="$HOME/Documentos/arq1"
arquivo2="$HOME/Documentos/arq2"

mapfile -t nlinha < <( grep -n "$procura" ${arquivo1} | cut -d: -f1 )

declare -p nlinha

n=0
while (( n < ${#nlinha[*]} )); do
echo "${nlinha[n]} d" >> linhas
((n++))
done

sed -f linhas < ${arquivo1} > $(basename "${arquivo1}")-resultado
sed -f linhas < ${arquivo2} > $(basename "${arquivo2}")-resultado
rm linhas


Teste:
~/Documentos$ cat arq1
laranja
limão
maçã
laranja
abacaxi
~/Documentos$ cat arq2
linha 1
linha 2
linha 3
linha 4
linha 5




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

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 13/10/2018 - 22:34h

rvmelo escreveu:

Então... eu sei que o comando "awk" pode remover linhas duplicadas de um arquivo... no entanto vamos supor que existem dois arquivos da seguinte forma:


I love you
jessyka
I love you
kate


O segundo arquivo da seguinte maneira:


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


Removendo as linhas "I love you" eu gostaria de remover as linhas correspondentes no segundo arquivo, por exemplo no segundo arquivo teria que remover a primeira e terceira linha, então os dois arquivos ficariam assim:


jessyka
kate


Já o segundo ficaria assim:


ID: 2
ID: 4


Como seria o script para realizar essa tarefa?

Boa noite.
Segue sugestão:
Linhas=$(awk '/laranja/ {printf "%sd;" ,NR}' arq01|sed 's/\;$//')
for arq in arq01 arq02;do
sed -i "${Linhas}" ${arq};
done

Ou, (sem o laço)
Linhas=$(awk '/laranja/ {printf "%sd;" ,NR}' arq01|sed 's/\;$//')
sed -i "${Linhas}" arq01
sed -i "${Linhas}" arq02


Obs.:
Os arquivos são os mesmos do exemplo do Ryuk.
Att.:
Marcelo Oliver



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

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 14/10/2018 - 17:51h

Segue outra opção, só com o AWK.
str="laranja"
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2

Obs.: Requer gawk.
Att.:
Marcelo Oliver


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

Roberto Vasconcelos Melo
rvmelo

(usa Outra)

Enviado em 15/10/2018 - 16:36h

msoliver escreveu:

Segue outra opção, só com o AWK.
str="laranja"
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2

Obs.: Requer gawk.
Att.:
Marcelo Oliver


Então... é quase isso... a única diferença é que preciso que não busque por uma palavra específica como "laranja" mas que remova todas as linhas duplicadas de um arquivo e que remova as linhas correspondentes no outro... como mostrei no exemplo... sem digitar uma palavra específica


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

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 15/10/2018 - 17:41h

rvmelo escreveu:

msoliver escreveu:

Segue outra opção, só com o AWK.
str="laranja"
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2

Obs.: Requer gawk.
Att.:
Marcelo Oliver


Então... é quase isso... a única diferença é que preciso que não busque por uma palavra específica como "laranja" mas que remova todas as linhas duplicadas de um arquivo e que remova as linhas correspondentes no outro... como mostrei no exemplo... sem digitar uma palavra específica


Ok, agora entendi . . .
Acrescente a linha abaixo, que definirá a variável "str".
str=$(sort ARQ1|uniq -d) 

Os demais comando continuam iguais:
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2


Se a RESPOSTA foi Satisfatória e sanou suas duvidas, marque o tópico como RESOLVIDO e a MiNHA resposta como a MELHOR....
Assim ganho uns pontinhos . . . Rsrsrsr

Att.:
Marcelo Oliver


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

Roberto Vasconcelos Melo
rvmelo

(usa Outra)

Enviado em 17/10/2018 - 15:41h

msoliver escreveu:

rvmelo escreveu:

msoliver escreveu:

Segue outra opção, só com o AWK.
str="laranja"
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2

Obs.: Requer gawk.
Att.:
Marcelo Oliver


Então... é quase isso... a única diferença é que preciso que não busque por uma palavra específica como "laranja" mas que remova todas as linhas duplicadas de um arquivo e que remova as linhas correspondentes no outro... como mostrei no exemplo... sem digitar uma palavra específica


Ok, agora entendi . . .
Acrescente a linha abaixo, que definirá a variável "str".
str=$(sort ARQ1|uniq -d) 

Os demais comando continuam iguais:
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2


Se a RESPOSTA foi Satisfatória e sanou suas duvidas, marque o tópico como RESOLVIDO e a MiNHA resposta como a MELHOR....
Assim ganho uns pontinhos . . . Rsrsrsr

Att.:
Marcelo Oliver


Então passei o código exatamente como vc disse para os arquivos que mostrei no exemplo:

#!/bin/bash

str=$(sort ARQ1|uniq -d)

FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2


No entanto recebi esse erro na hora de executar:

awk: line 1: runaway regular expression /I ...
awk: not an option: -i






9. Re: Remover linhas simultaneamente em dois arquivos

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 17/10/2018 - 18:59h

rvmelo escreveu:

msoliver escreveu:

rvmelo escreveu:

msoliver escreveu:

Segue outra opção, só com o AWK.
str="laranja"
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2

Obs.: Requer gawk.
Att.:
Marcelo Oliver


Então... é quase isso... a única diferença é que preciso que não busque por uma palavra específica como "laranja" mas que remova todas as linhas duplicadas de um arquivo e que remova as linhas correspondentes no outro... como mostrei no exemplo... sem digitar uma palavra específica


Ok, agora entendi . . .
Acrescente a linha abaixo, que definirá a variável "str".
str=$(sort ARQ1|uniq -d) 

Os demais comando continuam iguais:
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2


Se a RESPOSTA foi Satisfatória e sanou suas duvidas, marque o tópico como RESOLVIDO e a MiNHA resposta como a MELHOR....
Assim ganho uns pontinhos . . . Rsrsrsr

Att.:
Marcelo Oliver


Então passei o código exatamente como vc disse para os arquivos que mostrei no exemplo:

#!/bin/bash

str=$(sort ARQ1|uniq -d)

FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2


No entanto recebi esse erro na hora de executar:

awk: line 1: runaway regular expression /I ...
awk: not an option: -i


Boa noite.
Bem provável que o gawk não esteja instalado . . .
A opção -i inplace requer o gawk.

att.:
Marcelo



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

Roberto Vasconcelos Melo
rvmelo

(usa Outra)

Enviado em 18/10/2018 - 09:40h

msoliver escreveu:

rvmelo escreveu:

msoliver escreveu:

rvmelo escreveu:

msoliver escreveu:

Segue outra opção, só com o AWK.
str="laranja"
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2

Obs.: Requer gawk.
Att.:
Marcelo Oliver


Então... é quase isso... a única diferença é que preciso que não busque por uma palavra específica como "laranja" mas que remova todas as linhas duplicadas de um arquivo e que remova as linhas correspondentes no outro... como mostrei no exemplo... sem digitar uma palavra específica


Ok, agora entendi . . .
Acrescente a linha abaixo, que definirá a variável "str".
str=$(sort ARQ1|uniq -d) 

Os demais comando continuam iguais:
FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2


Se a RESPOSTA foi Satisfatória e sanou suas duvidas, marque o tópico como RESOLVIDO e a MiNHA resposta como a MELHOR....
Assim ganho uns pontinhos . . . Rsrsrsr

Att.:
Marcelo Oliver


Então passei o código exatamente como vc disse para os arquivos que mostrei no exemplo:

#!/bin/bash

str=$(sort ARQ1|uniq -d)

FNR="$(awk '/'${str}'/ {printf "FNR==%s||" ,NR}' ARQ1|sed 's/||$//')"
awk -i inplace '{if ('${FNR}') ;else print $0}' ARQ1 ARQ2


No entanto recebi esse erro na hora de executar:

awk: line 1: runaway regular expression /I ...
awk: not an option: -i


Boa noite.
Bem provável que o gawk não esteja instalado . . .
A opção -i inplace requer o gawk.

att.:
Marcelo


Já instalei e o que aparece agora é isso:

awk: lin. de com.:1: /I
awk: lin. de com.:1: ^ expressão regular inacabada
awk: lin. de com.:1: {if () ;else print $0}
awk: lin. de com.:1: ^ syntax error
awk: lin. de com.:1: {if () ;else print $0}
awk: lin. de com.:1: ^ syntax error


código:

#!/bin/bash

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





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

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 18/10/2018 - 16:51h

Boa tarde.
Qual distribuição vc utiliza?
Qual o comando para chamar o script?


12. Re: Remover linhas simultaneamente em dois arquivos

Roberto Vasconcelos Melo
rvmelo

(usa Outra)

Enviado em 18/10/2018 - 19:47h

msoliver escreveu:

Boa tarde.
Qual distribuição vc utiliza?
Qual o comando para chamar o script?


Boa noite. Utilizando o comando uname -a esse é o retorno:

Linux server-VirtualBox 4.4.0-104-generic #127-Ubuntu SMP Mon Dec 11 12:16:42 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 


Já com lsb_release -a o retorno é esse:

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial


Utilizo linux no virtualbox



01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts