Как найти одинаковые строки в txt

Имеется два текстовых файла содержащие строки: file_0.txt и file_1.txt. Количество строк может быть разным. Длина строк может быть разной. Файлы содержат большое количество строк. Необходимо эффективно вывести в другой файл строки, которые содержатся одновременно в двух файлах.
Пример:
Содержимое файла file_0.txt:

file_0.txt

j43j72h531
b2x891ow52
rr35986z77
x77jm9lp7g
q0pprcp52yawc10
wh3h476m2u
e7h0cv6rh5
5l7i700939
l3ri0p8p2f
l1h14no300

Содержимое файла file_1.txt:

file_1.txt

l1h14no300
j2615a2e0y
815555v33h
q0pprcp52yawc10
2vhhh0ugxv
rc2jl8lhdl
79qn640321
b2x891ow52

Необходимое содержимое файла file_2.txt после работы программы/команды:

file_2.txt

b2x891ow52
q0pprcp52yawc10
l1h14no300

Я пытался это сделать с помощью CMD команды findstr но в выводе получал почему-то не все совпадающие строки, хотя их наличие я проверял вручную. На процессоре i5-8400 скорость сравнения 100’000 строк в одном и 100’000 в другом файле меня вполне устраивает: 10-15 секунд.
Подскажите команду CMD/PowerShell или программу, чтобы сделать задуманное.

Имеется txt-файл следующего вида (в нем до 1000 строк):

0 => 112 15 мкр, 4/5, 4 700 000. Tel1
1 => 112 15 мкр, 4/5, 4 800 000. Tel1
2 => 112 14 мкр, Лада, 2/5, 45,3 м2 4 000 000. Tel2
3 => 112 14 мкр, Лада, 2/5, 45,3 м2, 4 000 000. Tel2
4 => 112 15 мкр, 2/5. Tel3
5 => 112 15 мкр, 3/5, 5 000 000 тг. Tel4
6 => 112 15 мкр, 4/5, 5 000 000. Tel1
7 => 112 15 мкр, 4/5, 6 800 000. Tel1
8 => 112 горняков 53, 3/4, не угол, варианты. Tel5
9 => 112 горняков 53, 3/4, не угол. Tel5
10 => 112 Горького 47, 1/4, счетчик, пл. окна, частично мебель, 4 500 000. Tel6
11 => 112 Горького 47, 1/4, хор. ремонт, ч/мебл, 4 500 000. Tel6
12 => 112 Достык, 1/4, кондиционер и кух/гарнитур. Tel7
13 => 112 Железорудная, пл/окна, ремонт, 2 300 000. Tel8

Нужно вывести на экран только повторы для каждой строки в файле, если они есть. Строки считаются одинаковыми, если 1) телефон в конце строк один и тот же и 2) длина всех строк одинаковая (без учета регистра, знаков препинания и пробелов, только буквы и цифры).
Итак, берем первую строку ‘0=>…’, пробежались циклом по всем строкам начиная с ‘1=>…’, вывели на экран. Затем берем вторую строку ‘1=>’ пробежались циклом по всем строкам начиная с ‘2=>…’. То есть, каждую n-строку сравниваем со строками, начиная с n+1-строкой и так до конца документа (именно это я прописал в if).

$arr = file($txt);
foreach($arr as $key=>$item){
    foreach($arr as $nkey=>$nitem){
       if($key != $nkey && $key < $nkey){
          echo '<p>' . $key . ': ' . $arr[$key] . '<p><br>';
          echo '<p>' . $nkey . ': ' . $arr[$nkey] . '<p><br><br>';
       }
    }
}

Это работает нормально, если всего две одинаковые строки. А теперь представьте, если их 10 штук идущих друг за другом в документе… На первом шаге цикла искомая строка выведется с 9 найденными повторами (здесь порядок). Но ведь потом мы продолжаем искать повторы для следующей строки. И выходит, что на втором шаге цикла выводится 2 строка, которую мы видели на первом шаге, и 8 найденных повторов (которые мы тоже видели на первом шаге). Теперь иллюстрация, как это выглядит у меня на основе строк, которые показал в начале:

__112   15 мкр, 4/5, 4 700 000. Tel1__ (строка "0=>..." и ее повторы, здесь порядок)
112 15 мкр, 4/5, 4 800 000. Tel1
112 15 мкр, 4/5, 5 000 000. Tel1
112 15 мкр, 4/5, 6 800 000. Tel1

__112   15 мкр, 4/5, 4 800 000. Tel1__ (не должно выводиться, дублирование)
112 15 мкр, 4/5, 5 000 000. Tel1
112 15 мкр, 4/5, 6 800 000. Tel1

__112   15 мкр, 4/5, 5 000 000. Tel1__ (не должно выводиться, дублирование)
112 15 мкр, 4/5, 6 800 000. Tel1


__112   14 мкр, Лада, 2/5, 45,3 м2 4 000 000. Tel2__
112 14 мкр, Лада, 2/5, 45,3 м2, 4 000 000. Tel2

__112   горняков 53, 3/4, не угол, варианты. Tel5__
112 горняков 53, 3/4, не угол. Tel5

__112   Горького 47, 1/4, счетчик, пл. окна, частично мебель, 4 500 000. Tel6__
112 Горького 47, 1/4, хор. ремонт, ч/мебл, 4 500 000. Tel6

Теперь как должно быть:

__112   15 мкр, 4/5, 4 700 000. Tel1__
112 15 мкр, 4/5, 4 800 000. Tel1
112 15 мкр, 4/5, 5 000 000. Tel1
112 15 мкр, 4/5, 6 800 000. Tel1

__112   14 мкр, Лада, 2/5, 45,3 м2 4 000 000. Tel2__
112 14 мкр, Лада, 2/5, 45,3 м2, 4 000 000. Tel2

__112   горняков 53, 3/4, не угол. Tel5__
112 горняков 53, 3/4, не угол. Tel5

__112   Горького 47, 1/4, счетчик, пл. окна, частично мебель, 4 500 000. Tel6__
112 Горького 47, 1/4, хор. ремонт, ч/мебл, 4 500 000. Tel6

Прошу прощения за размытые объяснения. Как не выводить на экран десять раз одно и то же? Спасибо!


Linux, Windows

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

  • 16.11.2022
  • 645
  • 0
  • 7
  • 7
  • 0

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

  • Содержание статьи
    • Вступление
    • В 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

This will print duplicate lines only, with counts:

sort FILE | uniq -cd

or, with GNU long options (on Linux):

sort FILE | uniq --count --repeated

on BSD and OSX you have to use grep to filter out unique lines:

sort FILE | uniq -c | grep -v '^ *1 '

For the given example, the result would be:

  3 123
  2 234

If you want to print counts for all lines including those that appear only once:

sort FILE | uniq -c

or, with GNU long options (on Linux):

sort FILE | uniq --count

For the given input, the output is:

  3 123
  2 234
  1 345

In order to sort the output with the most frequent lines on top, you can do the following (to get all results):

sort FILE | uniq -c | sort -nr

or, to get only duplicate lines, most frequent first:

sort FILE | uniq -cd | sort -nr

on OSX and BSD the final one becomes:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr

Студворк — интернет-сервис помощи студентам

Добрый вечер. Нужна помощь знатоков

Есть текстовый файл по пути D:arxivrezult.txt с содержимым:

Air robot
MPEG-4-5min 23s-458 MB

Best Mashine
MPEG-4-8min 41s-375 MB

Big hourse
MPEG-4-6min 41s-485 MB

Desperate
MPEG-4-5min 27s-464 MB

Нужно найти дубли по строкам и вывести в текстовый файл (duble.txt) по пути D:arxivduble.txt

Спасибо.

Добавлено через 18 часов 29 минут
Цена вопроса 4 у.е.

Добавлено через 15 минут
Если дублей нет — то текстовый файл (duble.txt) выводить не нужно.

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти ухажера для жены
  • Урок как составить реферат
  • Как найти провод габаритных огней
  • Как в ворде найти перенос строки
  • Как найти период выплат

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии