文件去重复

wxstorm
企鹅 2010-12-12 字数 112

一个文件里有很多行,每行一个word,想得到唯一的集合有啥命令么

就是起到set的效果?

ha

la

ha

lala

ho

ho

得到:

ha

la

lala

ho

3x

DOS 顽强生存着的DOS
24 个回复
milksea
肥了,又肥了 >>>_<<< 2010-12-12

sort foo.txt | uniq

排序 Windows 自己有,去重可以下载 GNUwin32 的、MingW 的或者 cygwin 的。

【 在 wxstorm (企鹅) 的大作中提到: 】

: 一个文件里有很多行,每行一个word,想得到唯一的集合有啥命令么

: 就是起到set的效果?

: 如

: ...................

qwertyzh
伤疤 2010-12-12

只会用excel做……

【 在 wxstorm (企鹅) 的大作中提到: 】

: 一个文件里有很多行,每行一个word,想得到唯一的集合有啥命令么

: 就是起到set的效果?

: 如

: ...................

HeliumLeoBob
小猪的姐夫~~ 2010-12-12

去重用for+if?

【 在 milksea (减肥 >_<~~~) 的大作中提到: 】

: sort foo.txt | uniq

: 排序 Windows 自己有,去重可以下载 GNUwin32 的、MingW 的或者 cygwin 的。

wincss
wincss 2010-12-12

行倒是行,很费劲。。。

【 在 HeliumLeoBob (PalSword Delphi) 的大作中提到: 】

: 去重用for+if?

milksea
肥了,又肥了 >>>_<<< 2010-12-12

就算能做到也不这么用

【 在 HeliumLeoBob (PalSword Delphi) 的大作中提到: 】

: 去重用for+if?

HeliumLeoBob
小猪的姐夫~~ 2010-12-12

求高效办法

【 在 milksea (减肥 >_<~~~) 的大作中提到: 】

: 就算能做到也不这么用

milksea
肥了,又肥了 >>>_<<< 2010-12-12

我第一帖就回了

【 在 HeliumLeoBob (PalSword Delphi) 的大作中提到: 】

: 求高效办法

wxstorm
企鹅 2010-12-12

直接DOS有啥快的方法去重么?

重新下命令感觉还是比较麻烦的,换台电脑就得再下一次。

【 在 milksea (减肥 >_<~~~) 的大作中提到: 】

: 我第一帖就回了

milksea
肥了,又肥了 >>>_<<< 2010-12-12

不知道。

如果是做脚本,能拷贝脚本自然也能拷贝一些常用的小工具,再不济 vbscript 什么的

应该也可以;如果是自己直接敲命令用,应该没有很多需要换机器的时候。

【 在 wxstorm (企鹅) 的大作中提到: 】

: 直接DOS有啥快的方法去重么?

: 重新下命令感觉还是比较麻烦的,换台电脑就得再下一次。

HeliumLeoBob
小猪的姐夫~~ 2010-12-12

不想下工具呀

【 在 milksea (减肥 >_<~~~) 的大作中提到: 】

: 我第一帖就回了

milksea
肥了,又肥了 >>>_<<< 2010-12-12

windows命令行自带工具不是万能的。

【 在 HeliumLeoBob (PalSword Delphi) 的大作中提到: 】

: 不想下工具呀

oicu
Oh! I see you! 2010-12-12

去重复倒是行。。缺点就是慢和保留原有的空行了。

【 在 wxstorm (企鹅) 的大作中提到: 】

: 一个文件里有很多行,每行一个word,想得到唯一的集合有啥命令么

: 就是起到set的效果?

: 如

: ...................

oicu
Oh! I see you! 2010-12-12

使用方法:把文本拖到批处理上就行了。。。

@echo off

:: Code by oicu#lsxk.org 2007/11/29

rem chcp 437>nul

:: 看情况使用,utf-8编码的文件不能少了chcp命令,一般无需使用,

:: 但无论是否使用都不支持utf-16的文件。

:: pushd "%~dp1"

:: 如果不用pushd和popd,文件都要用绝对路径不能只用文件名。

if "%~1"=="" goto :EOF

set outputfile=%~dpn1_output%~x1

type nul>"%outputfile%"

echo Waiting...

for /F "tokens=1* delims=:" %%i in ('findstr /n .* "%~1"') do (

findstr /B /E /C:"%%j" "%outputfile%">nul 2>&1 || echo.%%j>>"%outputfile%"

)

pause

start "" notepad "%outputfile%"

:: popd

exit

【 在 oicu (Oh! I see you!) 的大作中提到: 】

: 去重复倒是行。。缺点就是慢和保留原有的空行了。

milksea
肥了,又肥了 >>>_<<< 2010-12-12

不排序?实在是没理由用这种低效方式。不如调用 cscript 了。

【 在 oicu (Oh! I see you!) 的大作中提到: 】

: 使用方法:把文本拖到批处理上就行了。。。

: @echo off

: :: Code by oicu#lsxk.org 2007/11/29

: ...................

oicu
Oh! I see you! 2010-12-12

排序?那是取唯一值。你能保证排序后又能满足楼主的要求?

效率是低,前面说了啊。

【 在 milksea (减肥 >_<~~~) 的大作中提到: 】

: 不排序?实在是没理由用这种低效方式。不如调用 cscript 了。

oicu
Oh! I see you! 2010-12-12

换个电脑还不是一样要把批处理拷过去。。。这不是给自己找麻烦,

好好的uniq不用……

【 在 HeliumLeoBob (PalSword Delphi) 的大作中提到: 】

: 不想下工具呀

milksea
肥了,又肥了 >>>_<<< 2010-12-12

一个简单的 uniq 实现,这样就可以了吧(不要排序可以删掉 sort 那句):

setlocal enabledelayedexpansion

set tempstr=""

for /f "tokens=1" %%i in ('sort "%1"') do (

if not "%%i"=="!tempstr!" (

echo %%i >> "%2"

set tempstr=%%i

)

)

endlocal

原型代码,没有考虑太多情形。

【 在 oicu (Oh! I see you!) 的大作中提到: 】

: 排序?那是取唯一值。你能保证排序后又能满足楼主的要求?

: 效率是低,前面说了啊。

HeliumLeoBob
小猪的姐夫~~ 2010-12-12

>>是不是比较慢?

【 在 milksea (减肥 >_<~~~) 的大作中提到: 】

: 一个简单的 uniq 实现,这样就可以了吧(不要排序可以删掉 sort 那句):

: setlocal enabledelayedexpansion

: set tempstr=""

: ...................

milksea
肥了,又肥了 >>>_<<< 2010-12-12

至少这个算法是线性的。微软缓存能做好的话 >> 也不会慢的。

【 在 HeliumLeoBob (PalSword Delphi) 的大作中提到: 】

: >>是不是比较慢?