Перейти к содержимому

Как найти уникальную строку в файле linux

  • автор:

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

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

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

В 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

Добавить комментарий

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