Получите дубликат строки и остальную часть файла [ Большой файл 50 г]

#python #sed

Вопрос:

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

 sort file.tsv | uniq -d > duplicateList.tsv 
sort file.tsv | uniq -u > clean_List.tsv
 

Как вы можете видеть , процесс повторяется дважды, я хочу выполнить только одну комманду и вернуть оба результата без использования дубликатов комманды

примечание. Я могу использовать команду Linux или скрипт на Python

Комментарии:

1. Вы пробовали использовать tee , с помощью которого вы можете передавать содержимое файлов различным потребителям/файлам?

2. Да, я пробовал тройник ,Но это не решило мою проблему

3. Пожалуйста, определите «долгое время» . Пожалуйста, покажите, как именно вы использовали tee и как/почему это «не сработало» . Пожалуйста, покажите несколько репрезентативных строк вашего TSV-файла. Спасибо.

4. я имею в виду «долгое время», Процесс выполняется дважды, например,если первая команда занимает 15 минут, мне нужно выполнить следующую команду, и она займет 15 минут, я хочу сохранить дубликат электронной почты в файле с именем duplicateList.tsv и не сохранять дубликаты электронной почты в папке с именем clean_List.tsv в том же действии, мой файл TSV имеет формат списка электронной почты. aa@email.com

Ответ №1:

Это может сработать для вас (GNU sed), если файл уже отсортирован:

 sed -Ee 'N;/^(.*)n1$/!{P;D};:a;$w duplicatesFile' 
     -e '$d;N;/(n.*)1$/ba;h;s/.*n/n/;x;s/(.*)n.*/1/w duplicatesFile' 
     -e 'x;D' file > nonduplicatesFile
 

В обзоре: дубликаты записываются на duplicatesFile и остаток, на stdout который перенаправляется nonduplicatesFile .

Первоначально создается буфер из 2 строк, который сопоставляется с шаблоном для повторяющихся строк. Если нет, первая строка печатается в стандартный вывод, а затем удаляется и повторяется до тех пор, пока не появится дубликат строки.

Для повторяющихся строк сначала обрабатывается пограничный регистр конца файла, в котором выводятся все оставшиеся строки duplicatesFile и обработка останавливается.

В другом случае пространство шаблона копируется в пространство удержания, а затем разделяется на дубликаты и не дубликаты. Дубликаты, записанные в then duplicatesFile и не дублирующиеся, предваряются новой строкой, а затем новая строка удаляется с помощью D команды, которая вызывает повторный запуск команд sed за вычетом неявной выборки следующей строки из file .

N. B. Sed никогда не бывает самым быстрым решением, возможно, в этом случае выделенный фрагмент кода может обеспечить требуемую скорость.

Ответ №2:

Хеширование, безусловно, самое быстрое. Вот как в python:

 name = '/my/big/file'
lines = dict()
dups  = dict()
with open( name ) as f:
    line = line.rstrip()
    for line in f:
        if line in lines:
            dups[ line ] = True
        else:
            lines[ line ] = True
print( 'Duplicate(s)' )
for line in dups:
    print( line )
print( 'Unique(s)' )
for line in lines:
    if line not in dups:
        print( line )
 

Словари Python реализованы в виде хэшированной коллекции.