Имеется два текстовых файла содержащие строки: 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) выводить не нужно.