Como comparar dois arquivos e linhas de saída que não aparecem no primeiro?

4

Se eu tiver um arquivo A contendo uma lista de campos:

2017-04-23
2017-04-30
2017-05-07
2017-05-14
2017-05-21
2017-05-28
2017-06-04
2017-06-11
2017-06-18
2017-06-25

E outro arquivo B contendo uma lista de campos:

2017-04-23
2017-04-30
2017-05-07
2017-05-14
2017-05-21
2017-05-28
2017-06-04
2017-06-11
2017-06-18
2017-06-25
2017-07-02
2017-07-09
2017-07-16
2017-07-23

Como posso diferenciar rapidamente esses dois arquivos onde quero saber todos os campos no arquivo B , que não estão presentes no arquivo A ?

Este não é um diff regular onde eu quero ver uma diferença relativa entre arquivos, mas mais como uma comparação de hash, onde cada linha é uma entrada em um mapa. Eu quero obter uma lista de todas as linhas no arquivo B que não estão presentes no arquivo A para que eu possa removê-las onde cada linha no arquivo A representa um diretório que deve ser preservado.

Estou procurando uma solução Bash / CoreUtils.

    
por Zhro 10.01.2018 / 06:28

3 respostas

3

Se seus arquivos estiverem classificados, você pode usar comm :

$ comm -13 A B
2017-07-02
2017-07-09
2017-07-16
2017-07-23

com opções:

  • -1: suprima a coluna 1 (linhas exclusivas para FILE1)
  • -3: suprima a coluna 3 (linhas que aparecem em ambos os arquivos)
por 10.01.2018 / 16:19
2

grep é a ferramenta certa para o trabalho, embora não seja nem Bash nem da CoreUtils:

grep -Fxvf A B

Todas essas opções são compatíveis com POSIX. De man 1 grep :

-f pattern_file

Read one or more patterns from the file named by the pathname pattern_file. Patterns in pattern_file shall be terminated by a . A null pattern can be specified by an empty line in pattern_file. Unless the -E or -F option is also specified, each pattern shall be treated as a BRE, as described in the Base Definitions volume of POSIX.1-2008, Section 9.3, Basic Regular Expressions.

-F

Match using fixed strings. Treat each pattern specified as a string instead of a regular expression. If an input line contains any of the patterns as a contiguous sequence of bytes, the line shall be matched. A null string shall match every line.

-v

Select lines not matching any of the specified patterns. If the -v option is not specified, selected lines shall be those that match any of the specified patterns.

-x

Consider only input lines that use all characters in the line excluding the terminating to match an entire fixed string or regular expression to be matching lines.

    
por 10.01.2018 / 07:46
1

Outra maneira com alguns canos

cat A B|sort|uniq -u

edite-UUOC

Não há necessidade de gato

sort A B|uniq -u
    
por 10.01.2018 / 16:38