comparando dois arquivos linha por linha

0

Eu tenho dois arquivos do mesmo número de linhas em cada um.

1.txt

1,2,1,1
1,2,2,1
1,2,4,2
1,2,1,2

2.txt

1,2,1,2
1,2,2,1
1,2,4,1
1,2,1,1

Agora eu quero compará-los linha por linha, primeira linha com primeira linha, segunda com segunda e assim por diante e imprimir essas linhas no primeiro arquivo (1.txt) que não estão combinando com as linhas correspondentes no segundo arquivo (2.txt).

Neste cenário, a saída será:

1,2,1,1
1,2,4,2
1,2,1,2
    
por Sayan Sikder 11.07.2017 / 11:20

3 respostas

1

com o awk:

awk 'NR==FNR{a[$0];next}(!($0 in a)){print}' file2 file1

NR==FNR{a[$0];next} :
Para o primeiro arquivo (arquivo2), crie uma matriz a , com a chave $0 = linha inteira e vá para a próxima linha. NR é o número de registro global de awk e FNR é o número de registro de arquivo atual. A condição NR == FNR será válida apenas para o primeiro arquivo lido (arquivo2)

(!($0 in a){print} :
Quando o primeiro arquivo2 terminar, leia arquivo1 e se a linha inteira $0 do arquivo1 não pertencer às chaves do array a imprima esta linha.

Com grep:

grep -vxF -f file2 file1

-v : captura as linhas não correspondentes
-x : corresponde à linha inteira
-F : faz uma correspondência fixa em vez da correspondência de padrão em -f : use arquivo2 para carregar padrões

Para os dados atualizados para realizar uma comparação linha por linha, você pode usar o awk e não o grep:

awk 'NR==FNR{a[FNR]=$0;next}$0!=a[FNR]{print}' file2 file1
1,2,1,1
1,2,4,2
1,2,1,2

Obviamente, ambos os arquivos devem ter o mesmo número de linhas.

    
por 11.07.2017 / 11:45
3

abordagem simples comm (compare dois arquivos classificados linha por linha):

comm -2 -3 1.txt 2.txt

A saída:

1,2,1,2
1,2,3,3
  • -2 - suprima a coluna 2 (linhas exclusivas para FILE2 )

  • -3 - suprima a coluna 3 (linhas que aparecem nos dois arquivos)

Se os arquivos de entrada não forem classificados, use o seguinte:

comm -2 -3 <(sort 1.txt) <(sort 2.txt)

----------

A solução alternativa usando a ferramenta diff com --LTYPE-line-format=LFMT options:

diff --unchanged-line-format="" --old-line-format="%L" --new-line-format="" 1.txt 2.txt
  • --unchanged-line-format="" - elimine as linhas comuns de impressão

  • --new-line-format="" - elimine linhas de impressão do segundo arquivo

  • --old-line-format="%L" - exibe as linhas cruciais do primeiro arquivo

por 11.07.2017 / 11:43
1

Basta usar o comando diff:

 diff --suppress-common-lines -n file1 file2

Para o exemplo, a saída dos arquivos será semelhante a esta:

>diff file1 file2
2,3c2,3
< 1,2,1,2
< 1,2,3,3
---
> 1,2,1,1
> 1,2,3,1

< indica linhas do arquivo1,

> linhas indicadas do arquivo2,

= linhas indicadas comuns para ambos os arquivos

    
por 11.07.2017 / 11:34