#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 реализованы в виде хэшированной коллекции.