LINUX.ORG.RU

Сравнение двух списков и вывод в терминал несопадений (без использования vimdiff)

 


0

2

Подскажите, пожалуйста, как вывести несовпадения из двух файлов (списков) без использования vimdiff?

Пример:

Есть два файла:

$ cat file1
00000
11111
22222
33333

$ cat file2
00000
aaaaa
bbbbb
ccccc

Вывести совпадающие строки можно так:

$ grep -Fof file1 file2
00000

Как вывести несовпадения?

Спасибо!

Ответ на: комментарий от zolden

К сожалению, через -v не работает.

Пробовал таким образом:

$ grep -vFof file1 file2
$

Вероятно, можно как-нибудь сделать через цикл, но хотелось найти самый простой вариант, по возможности.

ameame2021
() автор топика

Для начала надо данные получше описать. У вас списки «почти» одинаковые, то есть одинаковое количество элементов, почти все совпадают, но несколько «испорчены»? Или элементов разное количество, перемешаны, могут дублироваться?

vodz ★★★★★
()
Ответ на: комментарий от vodz

Для начала надо данные получше описать.

Да, Вы правы. Сейчас опишу.

У вас списки «почти» одинаковые, то есть одинаковое количество элементов, почти все совпадают, но несколько «испорчены»?

Или элементов разное количество, перемешаны, могут дублироваться?

Элементов разное количество, они могут дублироваться.

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

ameame2021
() автор топика
Ответ на: комментарий от ameame2021

Есть 2 файла:

$ cat file1
00000
11111
22222
33333
$ cat file2
00000
aaaaa
bbbbb
ccccc

Так как первая строка есть в обоих файлах, то нужно получить результат:

11111
22222
33333
aaaaa
bbbbb
ccccc

Через grep -v не получилось сделать.

ameame2021
() автор топика
Ответ на: комментарий от Bootmen

Спасибо! В принципе работает, а можно сделать, не используя его?

ameame2021
() автор топика

grep -v –invert match

обычный поиск ABC(A)->A

обратный поиск ABC(A)->BC

-F –fixed-string-only

искать не RegExp, а Fixed String. то есть он ищет то, что ему дают, без интерпретации.

RegExp ABC(A.*C)->ABC

Fixed String - ABC(A.*C)->ничего, т.к. ABC не содержит в себе строку A.*C

-o –only-match

показать только то, что содержится в поле поиска. То есть может быть строка BABC, а поиск AB, оно найдет в BABC AB, но выдаст только AB, без B и C.

обычный поиск BABCDE(ABC)-> BABCDE

only-match BABCDE(ABC)-> -> ABC

-f –from-file

Взять поле поиска из файла

Что получается? -vFof file1 file2 [ file3 [ file4 .. ]] взять поле поиска из файла file1, применить поиск файлам file2 [ file3 [ file4 ]], показать только найденную строку поиска, не интерпретировать Regexp, и инвертировать поиск.

Вывод: это не дифф, потому что функция -o обрезает строки, тебе нужна функция -x, которая делает поле поиска на всю линию, то есть

-o ABC ADB ABC (AB) -> AB AB

-x ABC ADB ABC (AB) -> ничего, т.к. поле поиска AB с -x равносильно полю поиска ^AB$, ^$ это символы начала и конца строки

-vFxF, хотя может не заработать

Впрочем, какая разница? Чем тебе тебе diff не угодил?

anonymous
()
Ответ на: комментарий от ameame2021

Вывести нужно несовпадающие строки в двух файлах (сравнив их)

К сожалению, эта формулировка «сделайте мою работу, но я сам не могу её даже сформулировать», ибо это слишком общая формулировка для разного количества, перемешанности и дубликатов. Ну ладно. Зойдём с другой стороны. Желание отказаться от vimdiff — оно от чего? Результат слишком «человеческий» и не автоматизируемый? Или отсутствие на целевой системе утилиты? Или что-то не так делает?

vodz ★★★★★
()
Ответ на: комментарий от vodz

Желание отказаться от vimdiff — оно от чего?

Выводить результат нужно в стандартный вывод, не в файл.

Результат слишком «человеческий» и не автоматизируемый?

Нет прав на создание файлов. В общем коллеги ответили выше, diff вполне хватает для выполнения задачи. Спасибо!

ameame2021
() автор топика
Ответ на: комментарий от vodz

Или отсутствие на целевой системе утилиты?

Базовые утилиты баша кочуют в всех дистрах уже лет 25. Не хочет ТС читать маны. :)

Bootmen ☆☆☆
()
Ответ на: комментарий от ameame2021

Спасибо, с diff работает!

Ну так и знал. diff имеет смысл для «почти одинаковых», но «испорченных», «поправленных», а не сильно различных. То есть вы вынудили народ, чтобы вам перечислили все возможные методы и случаи, а вы выберите то, что вам понравится, вместо того, чтобы описать данные и желаемый результат. :(

vodz ★★★★★
()
Ответ на: комментарий от Bootmen

Спасибо, просто новичок, не знал про diff, знал про vimdiff. Спасибо за помощь!

ameame2021
() автор топика
Ответ на: комментарий от vodz

diff имеет смысл для «почти одинаковых»,

Везде есть предупреждение: перед использованием утилиты diff обработать файлы утилитой sort. Вот такие побочные явления. :)

Bootmen ☆☆☆
()
Ответ на: комментарий от Bootmen

Не хочет ТС читать маны.

Не, главное тут в том, что задачу сформулировать не может.

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

vodz ★★★★★
()
Ответ на: комментарий от Bootmen

Везде есть предупреждение:

В смысле? diff вообще-то задумывался для демонстрации изменений сырцов.

vodz ★★★★★
()
Ответ на: комментарий от Bootmen

Ну вы уж совсем

Типичный ЛОР, главное загадочно нагрубить, а потом доказывай, что не идиот, а наоборот.

Найдите отличие в первом абзаце от моего высказывания для чего создан diff, и слово сортировка в вашем URL.

vodz ★★★★★
()
Ответ на: комментарий от Bootmen

Да ну. Кто тут грубил?

А как это расценивать, когда на легитимное возражение, что про сортировку «везде» как раз и не пишут последовало ваше «Ну вы совсем»?

vodz ★★★★★
()
Ответ на: комментарий от vodz

Вы как баба. Последнее слово должно быть за ней. :) Не в обиду. У пингвидов со старых времен заведено: Нет ответа значит похер. Нет ответа значит видел.

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Ответ на: комментарий от Bootmen

Вы как баба. Последнее слово должно быть за ней. :)

Вы всё перепутали. Это вы демонстрируете бабскую логику, когда облажалась, но конкретно признаться нет ни духу и слов по теме, будет писать всякую пургу,, рассказывая, что все вокруг визжат, а не она.

vodz ★★★★★
()
Ответ на: комментарий от Bootmen

Читайте выше надоедливый усер.

ЧТД.

Касаемо ТСа, то завтра вдруг окажется, что и diff уже не устраивает, об этом весь форум и свидетельствует: вопросы 20 лет одни и те же, ответы в стиле «заюзайте XXX» на удачу пальцем в небо, вдруг прокатит, без попытки разобраться, что и почему решается и как правильно и общо.

vodz ★★★★★
()
Ответ на: комментарий от Bootmen

Зачем тратишь время на спор с 60 летним мужиком с психикой подростка пубертатного периода? Он из себя спеца корчит в каждой теме и так же часто ошибается ;d

anonymous
()
Ответ на: комментарий от anonymous

Да мне самому 62. Смешно дурака послушать. :)

Bootmen ☆☆☆
()
Ответ на: комментарий от EXL

В этом топике непонятки:

Bootmen ★★★ (05.12.20 09:27:54
Ответ на: комментарий от Bootmen 05.12.20 09:27:54
Спасибо! В принципе работает, а можно сделать, не используя его?
ameame2021 (05.12.20 09:29:21)
И ТУТ прикол! ДВЕ минуты ДВЕ на проверку..

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Ответ на: комментарий от superuser

ТС получил чего хотел. Не надо раздувать топик. В другой теме попробуйте. удачи...

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.