Как найти все повторяющиеся и не повторяющиеся строки в файлах

Иногда может возникнуть ситуация, когда есть два файла с похожим содержимым и нам необходимо найти только повторяющиеся значения в обоих файлах или же наоборот, только те значения, которые различаются в этих двух файлах.
В Linux
Ищем НЕ ПОВТОРЯЮЩИЕСЯ строки (уникальные)
Допустим у нас есть два текстовых файла: Содержимое файла file1.txt
aaa bbb ccc ddd eee fff ggg
Содержимое файла file2.txt
bbb aaa ccc eee 111 222 ddd xxx
Для того, чтобы найти все уникальные строки в файле file1.txt (т.е. те строки, которые не содержатся в файле file2.txt) можно воспользоваться следующей командой:
cat file1.txt | grep -v -f file2.txt
Результат выполнения данной команды будет таким:
fff ggg
Как мы видим в результате выполнения данной команды выводятся только те строки, которые уникальны в файле file1.txt и которых нет в файле file2.txt Для того, чтобы найти все уникальные строки в файле file2.txt (т.е. те строки, которые не содержатся в файле file1.txt) можно воспользоваться следующей командой:
cat file2.txt | grep -v -f file1.txt
Результат выполнения данной команды будет таким:
111 222 xxx
Ищем ПОВТОРЯЮЩИЕСЯ строки (дубликаты)
Допустим у нас есть два текстовых файла:
Содержимое файла file1.txt
aaa bbb ccc ddd eee fff ggg
Содержимое файла file2.txt
bbb aaa ccc eee 111 222 ddd xxx
Для того, чтобы найти все повторяющиеся строки (дубликаты) в файлах file1.txt и file2.txt можно воспользоваться следующей командой:
cat file1.txt | grep -f file2.txt
Результат выполнения данной команды будет таким:
aaa bbb ccc ddd eee
COREUTILS. Команда uniq. Вывод уникального содержимого
Общий синтаксис программы uniq в linux предельно простой:
unic [OPTIONS] [INPUT [OUTPUT]]
Тоесть, чтобы вывести уникальные строки, например в тестовом файле my_text_file, нужно команде uniq передать его имя в качестве аргумента
Нельзя, разумеется, забывать, что вы должны находится именно в той дирректории, где и лежит файл my_text_file. Иначе uniq необходимо передать полный путь до файла в linux:
Неуникальные строки можно посчитать. Для этого передайте quic в качестве опции ключ «-c».
unic -c /home/user/my_text_file
В выводе вы получите таблицу из 2-х колонок, в первой будет указано количество повторяющихся строк, во второй их значение.
В linux uniq также можно попросить печатать только те строки, которые имеют дубликаты, для этого нужно использовать ключ «-d»:
uniq -d /home/user/my_text_file
Опции можно комбинировать, и чтобы посчитать только строки которые имеют дубликаты, следует ввести такую команду:
uniq -d -с /home/user/my_text_file
В противовес ключу «-d» есть ключ «-u», заставляющий uniq выводить только строки, не имеющие дубликата:
uniq -u /home/user/my_text_file
Однако, как мы и освещали в вводой части, uniq работает только последовательно, следовательно строки, содержащиеся в файле, например:
не будут считаться уникальными. Чтобы разрешить эту проблему можно использовать в linux команду uniq совместно с командой sort, перенаправляя вывод одной команды на ввод другой:
sort -n my_text_file | uniq
или же просто использовать sort с ключом «-u»
sort -n -u my_text_file
Возможности и примеры использования утилиты sort мы уже освещали в статье COREUTILS. Команда sort. Сортировка вывода программ
Вывести уникальные неповторяющиеся строки
Нужно сравнить два файла и вывести только уникальные строки, т.е. только три последние строки из второго файла. Перебрал уже множество утилит типа sort comm diff uniq и не одна не предоставила требуемый результат.
Отслеживать
68k 218 218 золотых знаков 79 79 серебряных знаков 221 221 бронзовый знак
задан 21 сен 2018 в 15:35
13 1 1 серебряный знак 5 5 бронзовых знаков
А 1 и 2 это не уникальные строки? Их ведь нет во втором файле.
21 сен 2018 в 16:48
Судя по задаче нужны строки из второго файла которых нет в первом
21 сен 2018 в 16:50
diff не помог?
21 сен 2018 в 23:43
@de_frag думаю вопрос поставлен не корректно поэтому автор путается.
21 сен 2018 в 23:50
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Нужно сравнить два файла и вывести только уникальные строки, т.е. только три последние строки из второго файла.
первая часть предложения противоречит второй. уникальных строк будет пять (включая две первые строки из первого файла).
просто уникальные строки (первая часть предложения):
$ sort -u файл1 файл2
уникальные строки только из второго файла (вторая часть предложения):
$ comm -1 -3 файл1 файл2
опция -1 исключит уникальные для первого файла строки, опция -3 — общие для двух файлов строки. для корректной работы программы comm файлы должны быть отсортированы.
- $ info sort (если установлена программа info) или $ man sort
- $ info comm (если установлена программа info) или $ man comm
Выбрать уникальные строки
какой командой отсортировать и сохранить файл 1.txt чтоб до знака «|» были уникальные значения в строчке? символы могут быть абсолютно разные, не меняется только «|» Пример:
qwertyu>12345678|8888888 qwertyu>12345678|9999999 qwertyu>12345678|99999999 zxcvbnm>12345678|6666666 poiuytr>87654321|7777777
Итог после кода:
qwertyu>12345678|8888888 zxcvbnm>12345678|6666666 poiuytr>87654321|7777777
Denai
15.08.21 22:17:24 MSK