У меня есть большой текстовый файл с более чем 20 000 строк. Порядок строк важен. Я хочу удалить все повторяющиеся непустые строки в файле, не нарушая порядок. Какое программное обеспечение Windows может выполнить эту задачу?
Если возможно, я хотел бы вручную подтвердить/отклонить удаление каждой повторяющейся строки.
Для этой задачи:
Вы можете попробовать это: Удалить повторяющиеся строки . Это онлайн-приложение, которое удалит повторяющиеся текстовые строки.
Однако это не позволит вам вручную подтвердить/отклонить удаление каждой повторяющейся строки.
Честно говоря, я склоняюсь к такой (относительно простой) обработке текста, чтобы написать быстрый и грязный сценарий. Итак, вот быстрый и грязный скрипт 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 стоит больше, чем молочный коктейль.)
AkelPad и Geany могут это сделать. Оба легко обрабатывают 20 000 строк.
AkelPad: Параметры → Плагины... → Format::LineRemoveDuplicates → Вызов
Это не будет интерактивным, но вы можете увидеть строки, которые нужно удалить, используя Format::LineGetDuplicates.
Установщик поставляется с плагинами, но если вы собираетесь использовать портативную версию, обязательно установите плагин Format .
Geany:
Инструменты → Диспетчер плагинов → Включить операции со строками → Закрыть
инструменты → Операции со строками → Удалить повторяющиеся строки, упорядоченные
Хьюи
RockPaperLz - Замаскируй или Шкатулка