Tengo un archivo de texto grande con más de 20.000 líneas. El orden de las líneas es importante. Quiero eliminar todas las líneas duplicadas que no estén en blanco en el archivo, sin alterar el orden. ¿Qué software de Windows puede realizar esta tarea?
Si es posible, me gustaría confirmar/denegar manualmente la eliminación de cada línea duplicada.
Para esta tarea:
Puedes probar esto: Eliminar líneas duplicadas . Es una aplicación en línea que eliminará las líneas de texto duplicadas.
Sin embargo, no le permitirá confirmar/denegar manualmente la eliminación de cada línea duplicada.
Honestamente, mi inclinación por este tipo de procesamiento de texto (relativamente simple) es escribir un guión rápido y sucio. Así que aquí hay un script de Powershell rápido y sucio que puede modificar según sus necesidades. Para archivos de 20 000 líneas, creo que el get-content
comando debería estar bien, pero si sus archivos son demasiado grandes, es posible que necesite otras optimizaciones (hashing de líneas como claves de diccionario, usando la System.IO.StreamReader
clase .NET ...). Hay otras formas de mejorar las cosas también.
# 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
Guardé el archivo como Select-NonDuplicates.ps1
.
Aquí hay un archivo de entrada de muestra ( 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
y aquí el archivo de salida correspondiente ( 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
Invoco esto abriendo un símbolo del sistema e iniciando powershell como:
powershell -executionpolicy remotesigned
y luego en el indicador escribiendo
& Select-NonDuplicates.ps1 -InFile in.txt -Outfile out.txt
Para confirmar las eliminaciones, escriba:
& Select-NonDuplicates.ps1 -InFile in.txt -Outfile out.txt -ConfirmRemovals
(Se aplican los descargos de responsabilidad habituales: soy un programador mediocre y probablemente haya errores, el código no está bien probado y podría arruinarlo todo, pido disculpas si este nivel de detalle parece condescendiente, Windows cuesta más que un batido).
AkelPad y Geany pueden hacer eso. Ambos manejan 20.000 líneas fácilmente.
AkelPad: Opciones → Complementos... → Formato::LineRemoveDuplicates → Llamar
No será interactivo, pero puede ver las líneas que se eliminarán usando Format::LineGetDuplicates
El instalador viene con complementos, pero si va a utilizar la versión portátil, asegúrese de instalar el complemento Format .
Geany:
Herramientas → Administrador de complementos → habilitar operaciones de línea → Cerrar
herramientas → Operaciones de línea → Eliminar líneas duplicadas, ordenadas
Huey
RockPaperLz- Máscara o ataúd