Почему grep показывает разные результаты, когда я использую file1 как шаблон в файле2 и наоборот?

Когда я запускаю grep -m 1 -Fnxvf file1 file2 , для некоторых нескольких файлов я получаю другой номер строки, чем запуск grep -m 1 -Fnxvf file2 file1 ( grep -m 1 -Fnxvf file2 file1 files ).

Зачем?


Я уменьшил файлы до минимального примера.

file1

 Pp: 1 Id pezzo 193 posIn = { x = 132, y = 1432 } Pp: 1 Id pezzo 193 posIn = { x = 136, y = 1432 } Pp: 1 Id pezzo 193 posIn = { x = 84, y = 1436 } Pp: 1 Id pezzo 193 posIn = { x = 88, y = 1436 } 

file2

 Pp: 1 Id pezzo 193 posIn = { x = 132, y = 1432 } Pp: 1 Id pezzo 193 posIn = { x = 84, y = 1436 } Pp: 1 Id pezzo 193 posIn = { x = 88, y = 1436 } Pp: 1 Id pezzo 193 posIn = { x = 92, y = 1436 } 

Результаты:

 $ grep -m 1 -Fnaxvf file2 file1 2:Pp: 1 Id pezzo 193 posIn = { x = 136, y = 1432 } $ grep -m 1 -Fnaxvf file1 file2 4:Pp: 1 Id pezzo 193 posIn = { x = 92, y = 1436 } 

Первый результат – именно то, что я ожидаю, но во втором случае я ожидал увидеть (и обычно это так) вторую строку file2 .


Длительное объяснение

Я пытаюсь найти (и показать) первое различие между двумя файлами. Я хочу показать только первое различие и строку, где это происходит.

Я нашел этот ответ на SO (посмотрим на мой комментарий к ответу), и, похоже, он работает, но для некоторых нескольких файлов я заметил странное поведение, показанное выше.

  • Получить `grep`, чтобы не выводить имя файла
  • Как добавить возврат каретки перед каждой новой линией?
  • Удалить строки из файла, который существует в другом файле с более новой меткой времени
  • Поиск класса Java в наборе JAR с помощью find, unzip, grep
  • Использование как Grep, так и Cut
  • grep фиксированная строка в конце строки
  • Как сделать вертикальную полосу | работа в grep?
  • Одна командная строка оболочки, которая находит всех студентов в LEC05 и печатает свое имя в отсортированном порядке
  • One Solution collect form web for “Почему grep показывает разные результаты, когда я использую file1 как шаблон в файле2 и наоборот?”

    TLDR: у вас нет гарантии, что grep будет использовать ваш шаблон в порядке.

    Предположим, у вас есть два файла со следующим содержимым (по одной букве на строку, я складываю для удобства чтения)

    Файл 1

     ABDE 

    а также

    Файл 2

     ABCD 
    • Первый исключенный (поскольку вы используете -v) письмо из набора 2 (ABCD) в файле 1 является E.
    • Первое исключенное письмо из набора 1 в файле 2 – C.

    Сравнение файлов обычно:

    • cmp file1 file2 для двоичного файла, когда вам не нравится diff (вы даже можете использовать cmp -s (silent))
    • diff file1 file2 которые показывают псевдо-sed-код для перехода от file1 к файлу2 (diff file2 file1 довольно симметричен)
    • comm -123 file1 file2 чтобы показать общие строки (-3) в файле1 (-1) в файле2 (-2)
    Linux и Unix - лучшая ОС в мире.