Obtém as linhas únicas do segundo arquivo como resultado da comparação de dois arquivos

5

Eu tenho dois arquivos de texto e quero ler o arquivo1 linha por linha, procurando pela mesma linha no arquivo2 e removendo-a do arquivo2.

Eu tenho o pseudocódigo de:

for line in file1.txt
do
  sed search line and delete in file2.txt
done
    
por anlarye 04.11.2016 / 15:09

3 respostas

6

Você pode fazer isso com o grep.

Aqui está um exemplo:

$ echo localhost > local_hosts

$ grep -v -f local_hosts /etc/hosts
127.0.1.1       ubuntu

# The following lines are desirable for IPv6 capable hosts
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
    
por Michael Madden 04.11.2016 / 15:20
4

Geralmente você quer manter as linhas no arquivo2 que não estão no arquivo1, na verdade.

Existem mais possibilidades destes,

comm <(sort file1) <(sort file2) -23

via join

join -v 1 <(sort file1) <(sort file2)

ou através do AWK que não precisa de ordenar os ficheiros:

awk 'NR==FNR{lines[$0];next} !($0 in lines)' file2 file1
    
por αғsнιη 04.11.2016 / 16:11
0

Eu encontrei uma maneira de fazer isso através de mais pesquisas na internet. E usando apenas o grep também sem precisar ordenar o arquivo.

grep -Fvxf file2 file1

Isso exibirá as novas informações na tela, o que representa um problema, pois eu queria remover o que estava no arquivo2 do arquivo1 e ter um novo arquivo1. Como o código acima funcionava, eu tinha que adicionar para obter o que queria.

grep -Fvxf file2 file1 > tempfile && mv tempfile file1

Isso resolve meus problemas. Talvez não seja a melhor maneira, mas funciona.

    
por anlarye 05.11.2016 / 15:09