2012-10-11 52 views
9

Decir que tengo un archivo como:Usando los comandos de Windows/dos shell/batch, ¿cómo tomo un archivo y solo guardo líneas únicas?

apple 
pear 
lemon 
lemon 
pear 
orange 
lemon 

¿Cómo hago para que sólo tengo las líneas únicas, por lo que me sale:

apple 
pear 
lemon 
orange 

que puede o bien modificar el archivo original o crear uno nuevo.

Estoy pensando que hay una manera de escanear el archivo original una línea a la vez, verificar si la línea existe en el nuevo archivo y luego anexar si no lo hace. No estoy lidiando con archivos realmente grandes aquí.

Respuesta

10
@echo off 
setlocal disabledelayedexpansion 
set "prev=" 
for /f "delims=" %%F in ('sort uniqinput.txt') do (
    set "curr=%%F" 
    setlocal enabledelayedexpansion 
    if "!prev!" neq "!curr!" echo !curr! 
    endlocal 
    set "prev=%%F" 
) 

Lo que hace: ordena la primera entrada, y luego se va aunque de forma secuencial y salidas sólo si la línea actual es diferente a la anterior uno. Podría haber sido aún más simple si no fuera por la necesidad de manejar caracteres especiales (por eso esos setlocal/endlocal son para).
Sólo se hace eco de las líneas de stdout, si desea escribir en el archivo no (suponiendo que usted nombró su lote myUniq.bat) myUniq >>output.txt

+0

Impresionante, gracias! Terminé escribiendo un 'echo ... >> myUniq.bat' para cada línea, ejecuté' myUniq', luego lo borré, todo a la vez. – Kache

+2

@Kache Me alegro de poder ayudar. Si está abierto a 'powershell', también puede usar liners simples: (sin clasificar)' gc uniqinput.txt | select -unique' o (ordenado) 'gc uniqinput.txt | sort | unique' – wmz

+0

Gracias, pero no funciona para dicho archivo 0000 \ n1111 \ n2222 \ n. (\ n - CRLF real) Solo imprime 1111 y 2222. Quizás 0000 signifique algo específico para el lote. De todos modos, mi favor tome mi voto :) – user1503944

2

No hay una manera fácil de hacerlo desde la línea de comandos sin un programa adicional.

uniq hará lo que quiera.

O puede descargar CoreUtils for Windows para obtener las herramientas de GNU. Luego puede usar sort -u para obtener lo que desea.

Cualquiera de los dos debería poder llamarse desde un archivo por lotes.

Personalmente, si necesita hacer mucha manipulación de texto así, creo que sería mejor que obtuviera Cygwin. Entonces tendría fácil acceso a sort, sed, awk, vim, etc.

-3

puede utilizar el comando ORDENAR

por ejemplo

ORDENAR test.txt > Sorted.txt

+5

No, ordenar no eliminará los duplicados – jeb

2

Ejecute PowerShell desde el símbolo del sistema.

Suponiendo que los artículos están en un archivo llamado fruits.txt, lo siguiente será poner las líneas únicas en uniques.txt:

tipo fruits.txt | -único Sort-Object | Out-File uniques.txt

+0

Este enfoque no es bueno para archivos grandes. Para un archivo de 90 MB, utilizó más de 4 GB de RAM y tardó mucho tiempo en completarse. –

-1

También utilicé Powershell desde el símbolo del sistema, en el directorio en el que se encuentra mi archivo de texto, y luego utilicé el comando cat, el comando de ordenación y el cmdlet Get-Unique, como se menciona en http://blogs.technet.com/b/heyscriptingguy/archive/2012/01/15/use-powershell-to-choose-unique-objects-from-a-sorted-list.aspx.

se veía así:

PS C:\Users\username\Documents\VDI> cat .\cde-smb-incxxxxxxxx.txt | sort | Get-Unique > .\cde-smb-incxxxxxxx-sorted.txt 
-1

uso de GNU utilidad para ordenar:

sort -u file.txt 

Si estás en Windows y el uso de Git, a continuación, ordenar y muchas utilidades más útiles ya están aquí: C: \ Archivos de programa \ Git \ usr \ bin \

Simplemente agregue esta ruta a su variable de entorno% PATH%.

+0

duplicado de la respuesta de @ embedded.kyle – SteveFest

Cuestiones relacionadas