Приложение для обработки текста для удаления повторяющихся строк в текстовом файле

У меня есть большой текстовый файл с более чем 20 000 строк. Порядок строк важен. Я хочу удалить все повторяющиеся непустые строки в файле, не нарушая порядок. Какое программное обеспечение может выполнить эту задачу?

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

Для этой задачи:

  • Я предпочитаю программное обеспечение. Это не обязательное требование, но программное обеспечение должно стоить не дороже молочного коктейля.
  • Я предпочитаю программное обеспечение (без установщика), но это не является обязательным требованием.
Возможно, стоит посмотреть Удаление повторяющихся строк в Notepad++
@Хьюи, спасибо, Хьюи. В большинстве ответов требовалось изменить порядок строк. Ответы, в которых не было указано это требование, к сожалению, не сработали.

Ответы (3)

Вы можете попробовать это: Удалить повторяющиеся строки . Это онлайн-приложение, которое удалит повторяющиеся текстовые строки.

Однако это не позволит вам вручную подтвердить/отклонить удаление каждой повторяющейся строки.

Честно говоря, я склоняюсь к такой (относительно простой) обработке текста, чтобы написать быстрый и грязный сценарий. Итак, вот быстрый и грязный скрипт Powershell, который вы можете изменить под свои нужды. Для файлов с 20 000 строк я думаю, что get-contentкоманда должна быть в порядке, но если ваши файлы слишком велики, вам могут понадобиться другие оптимизации (хеширование строк в качестве ключей словаря, использование System.IO.StreamReaderкласса .NET...). Есть и другие способы улучшить ситуацию.

# Create a file consisting of an original file with duplicate lines 
# removed, preserving line order.
# Run this at your own risk!

# Paul "Worthless" Nijjar, 2016-03-29

param(
   [parameter(Mandatory=$true)][string] $InFile,

   [parameter(Mandatory=$true)][string] $OutFile,

   [parameter()][switch] $ConfirmRemovals
)

if ($InFile -eq $OutFile) { 
    write-error("Input and Output files should be different: $OutFile")
}

# Store all unique lines in a dictionary!
$linemap = @{}
$lineNumber = 0

# I hope you didn't need OutFile!
echo $null > $OutFile

foreach ($currLine in (Get-Content $InFile)) {
    $lineNumber++
    $outline =  "{0}:`"{1}`"" -f $lineNumber, $currLine
    write-debug $outline
    if ($currLine.trim() -eq "" ) { 
        # Line is blank. Preserve it. 
        $currLine >> $OutFile
    } elseif (! $linemap.ContainsKey($currLine)) { 
        # Not a duplicate. Record in map and write to file.
        $linemap.Set_Item($currLine, $lineNumber)
        $currLine >> $OutFile
    } else { 
        $outline = "Line {0} `"{1}`" is a duplicate of line {2}" -f $lineNumber, $currLine, $linemap.Get_Item($currLine)
        write-host $outline

        if ($ConfirmRemovals) { 
            $omitIt = read-host -prompt "Omit it? (y/n)"
            if ($omitIt -ne "y") { 
                write-host "Not deleting."
                $currLine >> $OutFile
            } else { 
                write-host "Omitting by confirmation."

            } # end if omitIt check
        } else { 
            write-host "Omitting."
        } # End if confirm removals

    } # end if linemap contains key

} # end get-content 

Я сохранил файл как Select-NonDuplicates.ps1.

Вот пример входного файла ( in.txt):

cat
bat
Cat
cat
The above two WILL be duplicates!
Powershell is case insensitive for dictionary strings.
frogg
frog
Rabbit
 Rabbit
The above will not be a duplicate.
Be careful of leading spaces. trim() can help here.
 Rabbit

Blank lines will be preserved.


Monkey
Monkey  
The above will not be a duplicate.
Be careful of trailing spaces, too.
frog
frog
Rabbit
Cat
Mountain goat

и вот соответствующий выходной файл ( out.txt):

cat
bat
The above two WILL be duplicates!
Powershell is case insensitive for dictionary strings.
frogg
frog
Rabbit
 Rabbit
The above will not be a duplicate.
Be careful of leading spaces. trim() can help here.

Blank lines will be preserved.


Monkey
Monkey  
Be careful of trailing spaces, too.
Mountain goat

Я вызываю это, открывая командную строку и запуская powershell как:

powershell -executionpolicy remotesigned

а затем в строке ввода

& Select-NonDuplicates.ps1 -InFile in.txt -Outfile out.txt 

Чтобы подтвердить удаление, введите:

& Select-NonDuplicates.ps1 -InFile in.txt -Outfile out.txt -ConfirmRemovals

(Применяются обычные заявления об отказе от ответственности: я посредственный программист и, вероятно, есть ошибки, код плохо протестирован и может все испортить, я прошу прощения, если такой уровень детализации покажется снисходительным, Windows стоит больше, чем молочный коктейль.)

Спасибо, Пол! Вообще ничего покровительственного! Поскольку powershell бесплатен с Windows, и я уже заплатил за него, общие финансовые затраты равны нулю. Я посмотрю на то, что вы создали, как только смогу. Может быть идеально! :-)

AkelPad и Geany могут это сделать. Оба легко обрабатывают 20 000 строк.

AkelPad: Параметры → Плагины... → Format::LineRemoveDuplicates → Вызов

Это не будет интерактивным, но вы можете увидеть строки, которые нужно удалить, используя Format::LineGetDuplicates.

Установщик поставляется с плагинами, но если вы собираетесь использовать портативную версию, обязательно установите плагин Format .

Geany:
Инструменты → Диспетчер плагинов → Включить операции со строками → Закрыть
инструменты → Операции со строками → Удалить повторяющиеся строки, упорядоченные

Большое спасибо! Я попробовал AkelPad, и это было очень быстро. К сожалению, он также хочет удалить около 500 пустых строк, разбросанных по всему файлу. Можно ли игнорировать пустые строки в AkelPad?
@RockPaperLizard, я не знаю. Я полностью пропустил это требование, извините. Это можно сделать с помощью плагина Scripts, вы можете спросить на форуме .
Совершенно никаких проблем. Спасибо за рекомендации!