Найти - Пользователи
Полная версия: Ищу скрипт для сравнения двух файлов и удаления повторов
Начало » Python для новичков » Ищу скрипт для сравнения двух файлов и удаления повторов
1
Madcap
Добрый день ! Помогите пожалуйста. Я ищу готовый скрипт для допиливания под свои нужды. В общем нужен скриптик, который будет сравнивать строки из двух файлов и удалять повторения строк из первого файла (OLD.txt) во втором файле (NEW.txt). Нужно для автоматизации на работе некоторых задач. Буду очень благодарен откликнувшимся !
Madcap
input = open('in.txt', 'r')
output = open('out.txt', 'w')
linesarray = input.readlines()
input.close()
seen = []
for line in linesarray:
    if line not in seen:
        seen.append(line)    
 output.writelines(seen)

Есть конечно вот такой код, но задача осложняется тем, что надо сравнить не строки целиком, а логика следующая: есть строка, содержащая IP-адрес и следом идет какой-то мусор, который нас не интересует, в другом файле этот айпишник тоже присутствует в какой-то строке, но за ним мусора не следует. Надо сделать так - если в одном файле присутствует айпишник и во втором файле он тоже есть в строке, то строку из второго файла, содержащую этот айпишник, нужно стереть, а в первом файле оставить все как есть.

Т.е. допустим вот пример строки из файла OLD.txt:
81.149.х.хх:3389;admin;123456 | Country: United Kingdom | State: N/A | City: | ZIP: N/A | ISP: BT |

Вот пример строки из второго файла NEW.txt:
174.127.xx.xx:3389;admin;123456 (т.е. уже в отпарсенном виде тоже самое)

В общем если в двух строках этих двух файлов есть один и тот же айпишник, то из файла NEW нужно его убить вместе со строкой, его содержащей, а OLD оставить без изменений, OLD вообще не трогать )
py.user.next
Вообще, это всё через sed + sort + grep быстрее делается.

Через sed выделяются ip из первого файла и копируются в новый файл.
Через sort с опцией -u в новом файле остаются только уникальные ip.
Через grep с опциями -f и -v из второго файла выводятся только строки без отфильтрованных адресов.

И всё это можно сделать за одну строку: новый файл и его фильтрованная версия подаётся по каналам (он даже не сохраняется).
giveback
Например вот так:

new_filename = 'NEW.txt'
old_filename = 'OLD.txt'
def get_ip(line):
    return line.split(':')[0]
old_ips = set([get_ip(line) for line in open(old_filename)])
result = [line for line in open(new_filename) if get_ip(line) not in old_ips]
with open(new_filename, 'w') as out:
    out.write(''.join(result))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB