Diff linhas semelhantes

1

Eu gostaria de imprimir uma lista de linhas onde a primeira palavra em dois arquivos é idêntica, e o resto das palavras não são. Alguma bagunça complicada com comm , grep e cut seria possível, mas esperamos que haja uma maneira mais simples.

Editar : consegui juntar alguns código de trabalho . Exemplos de testes:

$ cat file1
a 1 E
b 2 F
c 3 G

$ cat file2
a M X
b 2 Y
c 3 G

$ difff 1 file1 file2 # Differences in fields 2+3
1,2c1,2
< a 1 E
< b 2 F
---
> a M X
> b 2 Y

$ difff 1-2 file1 file2 # Differences in field 3 only
1c1
< b 2 F
---
> b 2 Y

Editar 2 : A velocidade agora é suportável (compara dois arquivos de 1800 e 8700 linhas em meio segundo).

    
por l0b0 19.09.2011 / 16:10

1 resposta

2

Assumindo que file1 e file2 estão classificados (caso contrário, join não funcionará):

diff -u file1 file2 |
  grep -E "^[+-]($(echo $(join -o0 file1 file2) | tr ' ' '|'))"

Explicação:

O comando join gerará o campo de junção que ocorre nos dois arquivos (ou seja, a primeira palavra da linha que é a mesma nos dois arquivos), um em cada linha. Nós echo this embora tr , substituindo todos os espaços por um pipe ( | ). O motivo para fazer o echo ligeiramente complicado (e não apenas direcionar o resultado de join diretamente por tr ) é que a saída de join terá uma nova linha no final dela, o que fazemos não quer substituir por um pipe.

Para os arquivos de exemplo ( aqueles que foram originalmente fornecidos pelo OP antes da edição da pergunta ), a join , echo , tr thingy produzirá bar|foo . Isso é usado como parte de uma expressão regular estendida em grep -E para filtrar a saída de diff -u .

A saída da linha de comando é:

-bar c d
+bar x y
    
por 20.09.2011 / 11:58

Tags