Compare duas listas de URLs e imprima URLs recém-adicionadas em um novo arquivo

8

Estou produzindo inicialmente dois arquivos que contêm listas de URLs. Vou me referir a eles como old e new . Gostaria de comparar os dois arquivos e, se houver URLs no arquivo new que não estão no arquivo old , gostaria que elas fossem exibidas em um arquivo extra_urls .

Agora, li algumas coisas sobre como usar o comando diff , mas, pelo que sei, isso também analisa a ordem das informações. Eu não quero que o pedido tenha algum efeito na saída. Eu só quero que os URLs extras em new sejam impressos no arquivo extra_urls , não importa em que ordem eles são colocados em um dos outros dois arquivos.

Como posso fazer isso?

    
por neilH 23.11.2015 / 16:20

4 respostas

14

Você pode usar o comando comm para comparar dois arquivos e exibir seletivamente linhas exclusivas de um ou o outro, ou as linhas em comum. Ele requer que as entradas sejam classificadas, mas você pode classificá-las rapidamente usando a substituição de processos.

comm -13 <(sort old.txt) <(sort new.txt)

Se você estiver usando uma versão de bash que não suporta substituição de processo, ela poderá ser emulada usando pipes nomeados. Um exemplo é mostrado em Wikipedia .

    
por 23.11.2015 / 16:53
6

Gostaria apenas de usar grep :

grep -vFf old new > extra_urls

Explicação

  • -f : informa grep para ler seus padrões de pesquisa de um arquivo. Nesse caso, old .
  • -v : diz ao grep para inverter a correspondência, para imprimir apenas linhas não correspondentes.
  • -F : diz ao grep para interpretar seus padrões de busca como strings, não como expressões regulares. Dessa forma, o . da URL será correspondido literalmente.

Combinados, estes fazem grep imprimir todas as linhas em new que não estavam em old . A ordem dos URLs no arquivo é irrelevante.

    
por 23.11.2015 / 17:03
1

Como o pedido é importante para você, use awk

awk '
    NR == FNR {old[$1]=1; next}
    !($1 in old)
' old new > extra
    
por 23.11.2015 / 16:31
0

Eu tenho um aplicativo chamado meld. Ele permite visualizar os dois (ou três) arquivos, lado a lado, mostra as diferenças e permite a cópia seletiva de um para o outro ou a exclusão de caracteres.

O Meld pode ser instalado a partir de um terminal com

sudo apt-get install meld 
    
por 27.11.2015 / 20:11