Hola a todos, bueno estoy buscando la forma de poder eliminar las palabras repetidas de un .txt
buscando por Internet encontré el siguiente código que funciona casi a la perfección:
echo off
set /a x=1
for /f "tokens=1 delims=" %%a in (token4.txt) do (
rem echo %%a
echo %%a > %%a.test
)
for /f "tokens=* delims= " %%a in ('dir /B "*.test"') do (
echo %%a>>semifinish.txt
)
echo > finish.txt
for /f "tokens=1,2 delims=." %%a in (semifinish.txt) do (
echo %%a >>finish.txt
rem echo %%b
rem echo %%p
)
for /f "tokens=* delims= " %%a in ('dir /B "*.test"') do (
del "%%a"
)
del semifinish.txt
Si en token4.txt tiene:
1
1
2
3
4
4
5
6
me queda un finish.txt de esta manera:
1
2
3
4
5
6
Pero me gustaría hacerle una modificación para que borrara los dos números que se repitieron es decir que usando el mismo ejemplo anterior me devolviera:
2
3
5
6
En palabras simples borrar ambas palabras o números repetidos.
Espero su ayuda, muchas gracias
¿Es totalmente necesario hacerlo con un script?
Podrías ahorrarte mucho trabajo con el comando:
Uniq -U Token4.txt > Finish.txt
uniq --help
Usage: uniq [OPTION]... [INPUT [OUTPUT]]
Discard all but one of successive identical lines from INPUT (or
standard input), writing to OUTPUT (or standard output).
Mandatory arguments to long options are mandatory for short options too.
-c, --count prefix lines by the number of occurrences
-d, --repeated only print duplicate lines
-D, --all-repeated[=delimit-method] print all duplicate lines
delimit-method={none(default),prepend,separate}
Delimiting is done with blank lines.
-f, --skip-fields=N avoid comparing the first N fields
-i, --ignore-case ignore differences in case when comparing
-s, --skip-chars=N avoid comparing the first N characters
-u, --unique only print unique lines
-w, --check-chars=N compare no more than N characters in lines
--help display this help and exit
--version output version information and exit
EDITO:
http://gnuwin32.sourceforge.net/downlinks/coreutils-bin-zip.php (http://gnuwin32.sourceforge.net/downlinks/coreutils-bin-zip.php)
Cita de: EleKtro H@cker en 2 Enero 2012, 03:41 AM
¿Es totalmente necesario hacerlo con un script?
Podrías ahorrarte mucho trabajo con el comando:
Uniq -U Token4.txt > Finish.txt
uniq --help
Usage: uniq [OPTION]... [INPUT [OUTPUT]]
Discard all but one of successive identical lines from INPUT (or
standard input), writing to OUTPUT (or standard output).
Mandatory arguments to long options are mandatory for short options too.
-c, --count prefix lines by the number of occurrences
-d, --repeated only print duplicate lines
-D, --all-repeated[=delimit-method] print all duplicate lines
delimit-method={none(default),prepend,separate}
Delimiting is done with blank lines.
-f, --skip-fields=N avoid comparing the first N fields
-i, --ignore-case ignore differences in case when comparing
-s, --skip-chars=N avoid comparing the first N characters
-u, --unique only print unique lines
-w, --check-chars=N compare no more than N characters in lines
--help display this help and exit
--version output version information and exit
EDITO:
http://gnuwin32.sourceforge.net/downlinks/coreutils-bin-zip.php (http://gnuwin32.sourceforge.net/downlinks/coreutils-bin-zip.php)
No necesariamente, la idea es que de la forma que sea cumpla su objetivo, probaré el programa, muchísimas gracias :D
Hola, sabes lo probé y funciona bien pero me surge el siguiente problema:
si los números son:
1
1
2
3
2
4
solo borra 1, el 2 no es borrado, creo que solo compara con la línea que está abajo
Disculpa que reabra esto, pero existe alguno parecido que deje guardado la palabra repetida y que distinga entre mayúsculas y minúsculas? saludos
Esto me funciona:
@echo off
setlocal enabledelayedexpansion
for /f %%_ in (a.txt) do (type "b.txt" | findstr /r "^%%_$" > nul 2>&1 && (for /f "tokens=*" %%# in ('type "b.txt" ^| findstr /r /i "^%%_$" ^| find /v /c ""') do (if %%# equ 1 (echo %%_ >> final.txt))))
C:\Users\leo\batch>type a.txt
1
1
2
3
4
4
5
6
C:\Users\leo\batch>type b.txt
1
1
2
3
4
4
5
6
C:\Users\leo\batch>code
C:\Users\leo\batch>type final.txt
2
3
5
6
C:\Users\leo\batch>
PD: Varias sentencias en una sola línea es mala ingeniería de software, no hagan lo que hice.
EDITO: Vale acabo de ver el code de
Leo xD Genial ese funciona.
Cita de: .:UND3R:. en 2 Enero 2012, 16:17 PM
Hola, sabes lo probé y funciona bien pero me surge el siguiente problema:
si los números son:
1
1
2
3
2
4
solo borra 1, el 2 no es borrado, creo que solo compara con la línea que está abajo
Pues vaya :/ Entonces no funciona demasiado bien...
Ayer probé a intentar hacer un script para ti, Conseguí con un FOR almacenar en una variable los strings repetidos y en otra sin los repetidos, de esta forma:
Words=;1;2;3;4;5;6
Repeated=;1;4
Pero me bloqueé en como hacer otro for para borrar los strings repetidos, de la variable "words" (Es lo que tu quieres xD) (Sin usar
SED.exe), y también en como pasar toda esa cadena reemplazando el signo ; por saltos de linea para que el nuevo archivo de texto quede escrito de arriba a abajo así...
2
3
5
6
...Así que dejé de hacerlo XDDD :-(
Aqui dejo el code por si alguien se anima a acabarlo o le puedes sacar algún uso :/...
Saludos
@echo off
Set File=Test.txt
For /F "tokens=*" %%_ in ('Type "%File%"') do (Call :Repeat %%_)
Echo Palabras: %Words%
Echo Repetidas: %repeated%
Pause
:Repeat
Echo "%Words%" | Find "%*" >nul
If %ErrorLevel% Equ 0 (Set Repeated=%Repeated%;%*) ELSE (Set Words=%Words%;%*)
Goto :EOF
(http://img202.imageshack.us/img202/1459/prtscrcapturetb.jpg)
Si ya sabes cuáles se repiten, aplicale un "find /v "...." a lo que sabes que se repite para eliminarlo del archivo original.
C:\Users\leo\batch>type a.txt
1
1
2
3
4
4
5
6
C:\Users\leo\batch>type a.txt | find /v "1" | find /v "4"
2
3
5
6
C:\Users\leo\batch>
Excelente, muchísimas gracias a ambos me ha servido ;-)
de verdad muchas gracias :D