Aplicación de procesamiento de texto para eliminar líneas duplicadas en un archivo de texto

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 puede realizar esta tarea?

Si es posible, me gustaría confirmar/denegar manualmente la eliminación de cada línea duplicada.

Para esta tarea:

  • Prefiero el software Este no es un requisito, pero el software no debe costar más que un batido.
  • Prefiero el software (sin instalador), pero esto no es un requisito.
Podría valer la pena echarle un vistazo Eliminar filas duplicadas en Notepad ++
@Huey Gracias Huey. La mayoría de las respuestas requerían cambiar el orden de las líneas. Las respuestas que no especificaron este requisito, lamentablemente, no funcionaron.

Respuestas (3)

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-contentcomando 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.StreamReaderclase .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).

¡Gracias Pablo! Nada condescendiente en absoluto! Dado que powershell es gratuito con Windows y ya lo pagué, el costo financiero general es cero. Echaré un vistazo a lo que has creado tan pronto como pueda. ¡Podría ser perfecto! :-)

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

¡Muchos gracias! Probé AkelPad y fue muy rápido. Desafortunadamente, también quiere eliminar unas 500 líneas en blanco intercaladas en todo el archivo. ¿Es posible ignorar las líneas en blanco en AkelPad?
@RockPaperLizard, no que yo sepa. Me perdí totalmente ese requisito, lo siento. Debería ser factible a través del complemento Scripts, es posible que desee preguntar en el foro .
No hay problema. ¡Gracias por las recomendaciones!