diff повідомляє той самий рядок, що і в двох файлах


14

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

Я написав простий скрипт, щоб перелічити всі пісні та вивести текстові файли, щоб потім запустити розріз. Він працює чудово здебільшого, але фактична команда 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 два файли відрізняються, хоча вони однакові!

але це стосується рядків у файлі, а не для всього файлу, і роздільна здатність, схоже, не підходить у цьому випадку.

$ 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 повідомив би той самий рядок удвічі більше подібного?


1
Можливо, спробуйте до hexdumpцих двох рядків і подивіться, чим відрізняється?
user43791

Відповіді:


24

Я здогадуюсь, ви просто не сортували файли. Це одне з видів поведінки, яке ви можете отримати при несортованому введенні:

$ 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.


2

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


2
cat -Aпоказав би більшість (усіх?) випадків недрукарських символів. Я не впевнений, як це впоралося б з диваком unicode, але мали бути показані інші недрукарські символи.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.