У меня есть 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 сообщит одну и ту же строку дважды, как это?
hexdump
эти две строки и посмотреть, что отличается?Ответы:
Я думаю, вы просто не отсортировали файлы. Это одно из действий, которые вы можете получить при несортированном вводе:
Но если вы сортируете:
Работа
diff
программы состоит в том, чтобы сказать вам, идентичны ли два файла и, если нет, где они различаются. Он не предназначен для поиска сходства между разными линиями. Если строка X одного файла не совпадает со строкой X другого, файлы не совпадают. Не имеет значения, содержат ли они абсолютно одинаковую информацию, если эта информация организована по-другому, файлы сообщаются как разные.источник
Поскольку вы не указали, что файлы отсортированы, я предполагаю, что это не так. Это ожидаемый результат,
diff
когда строка появляется в обоих файлах, но в разных местах. Это было бы понятно, если бы вы посмотрели на весьdiff
вывод, а не на его прохождениеgrep
.источник
Я бы предложил использовать что-то вроде программы hexdiff для получения двоичного / шестнадцатеричного вывода, поскольку человеческий глаз не всегда может определить разницу между символами, которые отображаются на компьютере, а некоторые символы могут не отображаться.
источник
cat -A
показал бы большинство (все?) случаев непечатных символов. Я не уверен, как он справился бы со странностью юникода, но другие непечатные символы должны были быть показаны.