Por que o grep mostra resultados diferentes quando eu uso file1 como padrão no arquivo2 e vice-versa?

2

Quando eu executo grep -m 1 -Fnxvf file1 file2 , para alguns arquivos eu recebo um número de linha diferente do que executando grep -m 1 -Fnxvf file2 file1 ( arquivos trocados ).

Por quê?

Reduzi os arquivos para um exemplo mínimo.

arquivo1

Pp: 1        Id pezzo 193        posIn = { x = 132, y = 1432 }
Pp: 1        Id pezzo 193        posIn = { x = 136, y = 1432 }
Pp: 1        Id pezzo 193        posIn = { x = 84, y = 1436 }
Pp: 1        Id pezzo 193        posIn = { x = 88, y = 1436 }

arquivo2

Pp: 1        Id pezzo 193        posIn = { x = 132, y = 1432 }
Pp: 1        Id pezzo 193        posIn = { x = 84, y = 1436 }
Pp: 1        Id pezzo 193        posIn = { x = 88, y = 1436 }
Pp: 1        Id pezzo 193        posIn = { x = 92, y = 1436 }

Resultados eu recebo:

$ grep -m 1 -Fnaxvf file2 file1
2:Pp: 1      Id pezzo 193        posIn = { x = 136, y = 1432 }
$ grep -m 1 -Fnaxvf file1 file2
4:Pp: 1      Id pezzo 193        posIn = { x = 92, y = 1436 }

O primeiro resultado é exatamente o que estou esperando, mas no segundo caso eu esperava ver (e geralmente é assim), a segunda linha de file2 .

Longa explicação

Estou tentando encontrar (e mostrar) a primeira diferença entre dois arquivos. Quero mostrar apenas a primeira diferença e a linha em que isso acontece.

Eu encontrei esta resposta em SO (dê uma olhada no meu comentário para a resposta) e parece trabalho, mas para alguns arquivos eu notei o estranho comportamento mostrado acima.

    
por Paolo M 22.10.2015 / 11:17

1 resposta

3

TLDR: você não tem garantia de que o grep irá usar seu padrão em ordem.

Suponha que você tenha dois arquivos com o seguinte conteúdo (uma letra por linha, eu dobrei para facilitar a leitura)

File 1

A B D E

e

File 2

A B C D
  • O primeiro excluído (desde que você use -v) carta do conjunto 2 (A B C D) no arquivo 1 é E.
  • A primeira letra excluída do conjunto 1 no arquivo 2 é C.

A comparação de arquivos geralmente é:

  • cmp file1 file2 para arquivo binário, quando você não se importa com diff (você pode até usar cmp -s (silencioso))
  • diff file1 file2 que mostra um código pseudo sed para ir de arquivo1 para arquivo2 (arquivo diff1 arquivo1 é bastante simétrico)
  • comm -123 file1 file2 para mostrar linhas em comum (-3) no arquivo1 (-1) no arquivo2 (-2)
por 22.10.2015 / 11:36