Логотип

Как найти уникальные данные в двух файлах в Linux

Как найти уникальные данные в двух файлах в Linux

Вам сложно сравнить сходства и различия между двумя файлами в командной строке Linux? Не волнуйтесь, в этой статье мы расскажем, как выполнить эти задачи без использования сторонних инструментов, только с помощью встроенных команд.

Прежде чем продолжить, ознакомьтесь со следующими двумя файлами, которые мы будем использовать в качестве примеров для демонстрации всех команд, о которых пойдет речь в этой статье:

andreyex@linux: $ cat file1.txt
1
2
2
3
4
5
andreyex@linux: $ cat file2.txt
1
6
7
2
8
9
andreyex@linux: $

 

Как видно, ‘1‘ и ‘2‘ повторяются в обоих файлах, но, что удивительно, ‘2‘ встречается в первом файле несколько раз, а ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘ — это различия между двумя файлами.

Итак, давайте посмотрим, как можно найти сходства и различия между этими двумя файлами с помощью терминала Linux.

 

Найдите общую строку в двух файлах

Первое, что нужно сделать, — найти общую строку в обоих файлах. Для этого можно использовать несколько команд Linux. В этой статье я сосредоточусь на двух командах: awk и grep.

Итак, чтобы найти в обоих файлах одинаковую строку, которая не повторяется, можно использовать следующую команду awk:

$ awk 'NR==FNR{a[$1]++;next} a[$1] ' file1.txt file2.txt

 

Читать  Как проверить скорость моей сетевой карты в Linux?

Выходной сигнал:

andreyex@linux:-$ awk 'NR==FNR{a[$1]++;next} a[$1] ' file1.txt file2.txt
1
2
andreyex@linux: $

 

Как видите, программа легко вывела общие строки ‘1‘ и ‘2‘ из обоих файлов. Чтобы понять, какие параметры мы использовали вместе с командой, ознакомьтесь со списком ниже.

  • NR==FNR{a[$1]++;next: Он сравнит два файла, разбив каждую строку на ключ в ассоциативном массиве, а затем увеличив значение для перехода к следующей строке.
  • a[$1]: Это используется для обработки второго файла: если первое поле (в первом файле) текущей строки существует во втором файле, awk выводит эту строку.

 

Чтобы сравнить общую строку в двух файлах с помощью grep, используйте следующую команду:

$ grep -o -w -F -f file1.txt file2.txt | sort | uniq -c

 

Выходной сигнал:

andreyex@linux:-$ grep -o -w -F -f file1.txt file2.txt | sort | uniq -c
1 1
1 2
andreyex@linux: -$

 

Принимая во внимание,

  • -o: Это позволит выводить только совпадающие части строки, а не всю строку целиком.
  • -w: Это позволяет сопоставлять только целые слова, а не подстроки в более длинных словах.
  • -F: Это позволяет рассматривать шаблоны как фиксированные строки, а не как регулярные выражения, что удобно при поиске точных совпадений.
  • -f file1.txt file.2.txt: Это файлы, которые будут использоваться для поиска шаблонов.
  • sort: Эта команда используется для сортировки строк текста в алфавитном порядке.
  • uniq -C: Эта команда используется для удаления повторяющихся строк из отсортированного файла и подсчета количества вхождений каждой уникальной строки.
Читать  Инструмент командной строки: HTOP

 

Найдите различия между двумя файлами

Найти различия между двумя файлами — задача не из простых. Например, в обоих файлах встречается строка «2», но в первом файле она повторяется дважды, а во втором — один раз. Как вы думаете, что из этого можно считать сходством, а что — различием между этими двумя файлами?

Давайте выясним это с помощью команды diff, чтобы проверить, какие строки есть в первом файле, но отсутствуют во втором.

$ diff file1.txt file2.txt | grep '<' | cut -c 3

 

Выходной сигнал:

andreyex@linux: $ diff file1.txt file2.txt | grep '<' | cut -c 3
2
3
4
5
andreyex@linux: $

 

Как и ожидалось, дополнительная строка ‘2‘ считается разницей между этими двумя файлами. Таким образом, при сравнении двух файлов количество повторяющихся строк в них должно совпадать.

Давайте выясним, какие строки есть во втором файле, но отсутствуют в первом, с помощью команды comm:

$ comm -13 <(sort file1.txt) <(sort file2.txt)

 

Выходной сигнал:

andreyex@linux: $ comm -13 <(sort file1.txt) <(sort file2.txt)
6
7
8
9
andreyex@linux: $

 

На этот раз, как вы могли заметить, в выводе не появилось ‘2‘. Вместо этого мы получили ‘6‘, ‘7‘, ‘8‘ и ‘9‘, которых нет в первом файле. ‘2‘ не появилось, потому что во втором файле оно встречается только один раз. Таким образом, при сравнении файлов считается, что в них больше сходств, чем различий.

Читать  Руководство пользователя Zypper Package Manager для пользователей openSUSE

Наконец, давайте с помощью следующей команды найдем все различные строки, повторяющиеся в обоих файлах:

$ comm -3 <(sort file1.txt) <(sort file2.txt) | tr -d '\t'

 

Выходной сигнал:

andreyex@linux:-$ comm -3 <(sort file1.txt) <(sort file2.txt) | tr -d '\t'
2
3
4
5
6
7
8
9
andreyexglinux: $

 

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

 

Найдите сходства и различия между двумя файлами с помощью Vim

Существует множество инструментов с графическим интерфейсом, которые помогут вам легко найти сходства и различия между двумя файлами без необходимости запоминать длинные команды, о которых мы говорили ранее.

Теперь вместо этих инструментов с графическим интерфейсом я предпочитаю использовать редактор Vim, в котором есть функции, позволяющие быстро находить сходства и различия между двумя файлами в наглядном формате.

$ vimdiff file1.txt file2.txt

#или

$ vim -d file1.txt file2.txt

 

Выходной сигнал:

 

Повторяющиеся строки расположены друг напротив друга, а различия либо оставлены пустыми, либо выделены красным.

Вот и всё, на этом статья заканчивается. Надеюсь, сегодня вы узнали что-то новое. Напишите в комментариях, о чём бы вы хотели прочитать в следующий раз.

Редактор: AndreyEx

Рейтинг: 5 (1 голос)
Если статья понравилась, то поделитесь ей в социальных сетях:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

13 + 2 =

Это может быть вам интересно


Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала