Como imprimir a diferença de dois arquivos de texto usando shell script?

0

Eu tenho dois arquivos de texto contendo uma lista de URLs. Eu quero comparar os dois arquivos e imprimir as diferenças. Eu sei que podemos usar 'diff', mas aqui está o problema. Os URLs em um arquivo estão cheios, e. http://google.com , enquanto no outro arquivo eles não têm o http:// , por ex. google.com

Arquivo 1:

http://google.com

Arquivo 2:

google.com

Eu quero que estes sejam ignorados e apenas URLs realmente diferentes sejam impressos. É possível?

    
por Koshur 21.01.2016 / 14:00

3 respostas

0

Tome, por exemplo, esses dois arquivos:

$ cat file1
http://google.com
example.com
http://foobar.org

$ cat file2
example.com
google.com
foobar.org
unique.url

Gostaria apenas de usar uma ferramenta como sed para remover tudo até a última ocorrência de // . Além disso, para usar diff , os dois arquivos precisam ser classificados. Combinando os dois nos dá:

$ diff <(sed 's#.*//##' file1 | sort) <(sort file2) 
3a4
> unique.url

Como alternativa, use comm -3 :

$ comm -3 <(sed 's#.*//##' file1 | sort) <(sort file2) 
    unique.url

Você pode remover o espaço em branco inicial com sed novamente:

$ comm -3 <(sed 's#.*//##' file1 | sort) <(sort file2) | sed 's/^\s*//'
unique.url

Outra abordagem seria remover o http:// dos dois arquivos e imprimir o que resta, depois passá-lo por uniq -u , que só imprimirá linhas exclusivas. Como as URLs que estão presentes nos dois arquivos não serão exclusivas, isso só imprimirá as que estão presentes em um dos dois arquivos:

$ sed 's#.*//##' file1 file2 | sort | uniq -u
unique.url
    
por 21.01.2016 / 14:28
3

Sim, você pode, por exemplo use sed para remover certas coisas antes de colocá-las em diff :

$ diff file1 file2
1,3c1,3
< http://google.com/search
< http://www.google.com
< http://example.com
---
> google.com/search
> google.com
> example.com

$ < file1 sed 's|https\{0,1\}://||g' | diff - file2
2c2
< www.google.com
---
> google.com
    
por 21.01.2016 / 14:04
0

Sim, você pode pular a parte (por exemplo, http:// ) com % co_de separador de campos de% .

da página de manual:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

Exemplo:

$ cat file1
http://google.com
http://gnu.org
http://fsf.org
http://linux.stackexchange.com

$ cat file2
google.com
gnu.org
fsf.org
unix.stackexchange.com

$ cat file1 | awk -F "http://" '{print $2}'
google.com
gnu.org
fsf.org
linux.stackexchange.com

$ cat file1 | awk -F "http://" '{print $2}' | diff - file2
4c4
< linux.stackexchange.com
---
> unix.stackexchange.com

Nota:

  • Você também pode usar awk geralmente para -F "://" ou https://
  • Os arquivos devem ser http:// ed antes da comparação
por 21.01.2016 / 14:42