diff riporta la stessa riga come diversa in 2 file


13

Ho 2 file contenenti un elenco di brani. hdsongs.txt e sdsongs.txt

Ho scritto un semplice script per elencare tutte le canzoni e l'output in file di testo, per poi eseguire un diff. Funziona bene per la maggior parte, ma l'attuale comando diff nello script mostra la stessa riga di essere diverso. Questo sta effettivamente accadendo per più linee, ma non per tutte.

Ecco un esempio di un brano in entrambi i file:

$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3

Non ci sono caratteri speciali finali che posso vedere:

$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$

Quando eseguo diff, mostra la stessa riga in ogni file; ma le linee non sono uguali?

$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3

Questo è simile al thread qui: diff segnala che due file differiscono, sebbene siano uguali!

ma questo vale per le linee all'interno del file, non per l'intero file, e la risoluzione non sembra adattarsi in questo caso.

$ diff <(cat -A phonesongsonly.txt) <(cat -A passportsongsonly.txt) | grep Apologize
< Timbaland/Apologize.mp3$
> Timbaland/Apologize.mp3$

$ wdiff -w "$(tput bold;tput setaf 1)" -x "$(tput sgr0)" -y "$(tput bold;tput setaf 2)" -z "$(tput sgr0)" hdsongs.txt sdsongs.txt | grep Apologize
>Timbaland/Apologize.mp3
>Timbaland/Apologize.mp3

Qualcuno sa perché diff dovrebbe riportare la stessa riga due volte in questo modo?


Forse prova a hexdumpquelle due righe e vedi cosa differisce?
user43791

Risposte:


23

Suppongo che tu non abbia semplicemente ordinato i file. Questo è uno dei comportamenti che puoi ottenere su input non ordinati:

$ cat file1 
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo

Ma, se ordini:

$ diff <(sort file1) <(sort file2)
$ 

Il diffcompito del programma è dirti se due file sono identici e, in caso contrario, dove differiscono. Non è progettato per trovare somiglianze tra linee diverse. Se la riga X di un file non è uguale alla riga X dell'altro, i file non sono gli stessi. Non importa se contengono esattamente le stesse informazioni, se tali informazioni sono organizzate in modo diverso, i file vengono riportati come diversi.


4

Dal momento che non hai dichiarato che i file sono ordinati, suppongo che non lo siano. Questo è l'output previsto da diff quando appare una linea in entrambi i file, ma in posizioni diverse. Ciò sarebbe chiaro se si guardasse l'intero diffoutput, anziché eseguirne il piping grep.


2

Suggerirei di provare a usare qualcosa come il programma hexdiff per ottenere un output binario / esadecimale, poiché l'occhio umano non può sempre dire la differenza tra i caratteri visualizzati da un computer e alcuni caratteri potrebbero non essere visualizzati.


2
cat -Aavrebbe mostrato la maggior parte (tutti?) casi di caratteri non stampabili. Non sono sicuro di come avrebbe affrontato la stranezza unicode, ma avrebbero dovuto essere mostrati altri caratteri non stampabili.
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.