diff сообщает одну и ту же строку как разные в 2 файлах

13

У меня есть 2 файла, содержащие список песен. hdsongs.txt и sdsongs.txt

Я написал простой скрипт, чтобы вывести список всех песен и вывести их в текстовые файлы, чтобы потом запустить diff. По большей части он работает нормально, но в самом скрипте команда diff показывает ту же строку, что и другая. На самом деле это происходит для нескольких строк, но не для всех.

Вот пример песни в обоих файлах:

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

Там нет конечного специального символа, который я вижу:

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

Когда я запускаю diff, он показывает одну и ту же строку в каждом файле; но разве линии не совпадают?

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

Это похоже на ветку здесь: в отчетах о различиях два файла отличаются, хотя они одинаковы!

но это касается строк в файле, а не всего файла, и разрешение в этом случае, похоже, не подходит.

$ 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

Кто-нибудь знает, почему diff сообщит одну и ту же строку дважды, как это?

user1718443
источник
Может быть, попробовать hexdumpэти две строки и посмотреть, что отличается?
user43791 14.12.15

Ответы:

23

Я думаю, вы просто не отсортировали файлы. Это одно из действий, которые вы можете получить при несортированном вводе:

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

Но если вы сортируете:

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

Работа diffпрограммы состоит в том, чтобы сказать вам, идентичны ли два файла и, если нет, где они различаются. Он не предназначен для поиска сходства между разными линиями. Если строка X одного файла не совпадает со строкой X другого, файлы не совпадают. Не имеет значения, содержат ли они абсолютно одинаковую информацию, если эта информация организована по-другому, файлы сообщаются как разные.

Тердон
источник
4

Поскольку вы не указали, что файлы отсортированы, я предполагаю, что это не так. Это ожидаемый результат, diff когда строка появляется в обоих файлах, но в разных местах. Это было бы понятно, если бы вы посмотрели на весь diffвывод, а не на его прохождение grep.

G-Man говорит: «Восстанови Монику»
источник
2

Я бы предложил использовать что-то вроде программы hexdiff для получения двоичного / шестнадцатеричного вывода, поскольку человеческий глаз не всегда может определить разницу между символами, которые отображаются на компьютере, а некоторые символы могут не отображаться.

Джейсон Раш
источник
2
cat -Aпоказал бы большинство (все?) случаев непечатных символов. Я не уверен, как он справился бы со странностью юникода, но другие непечатные символы должны были быть показаны.
Terdon