标题: [文本处理] [已解决]批处理怎样排除重复并列出重复的行及个数? [打印本页]
作者: gcbgczhang 时间: 2019-7-4 23:30 标题: [已解决]批处理怎样排除重复并列出重复的行及个数?
本帖最后由 gcbgczhang 于 2021-7-31 14:21 编辑
请教各位老师,我想对一个文本文件里的各行字符串排除重复并列出重复行内容及个数
文件list.txt内容:
111111
哈哈
333333
65767
哈哈
林林
111111
哈哈
...
排重后输入到文件tmp1.txt内容:
111111
哈哈
333333
65767
林林
重复的输到文件tmp2.txt内容:
11出现3次
哈哈出现2次
作者: zaqmlp 时间: 2019-7-5 07:52
- @echo off
- set info=互助互利,支付宝扫码头像,感谢赞助
- rem 有问题,可加QQ956535081及时沟通
- title %info%
- cd /d "%~dp0"
- set "input=list.txt"
- set "output1=tmp1.txt"
- set "output2=tmp2.txt"
- powershell -NoProfile -ExecutionPolicy bypass ^
- $dic=New-Object 'System.Collections.Generic.Dictionary[string,int]';^
- $text=[IO.File]::ReadAllLines('%input%',[Text.Encoding]::Default);^
- for($i=0;$i -lt $text.length;$i++){^
- if(-not $dic.ContainsKey($text[$i])){^
- $dic.Add($text[$i],1);^
- }else{^
- $dic[$text[$i]]++;^
- };^
- };^
- $fs1=New-Object System.IO.FileStream('%output1%', [System.IO.FileMode]::Create);^
- $sw1=New-Object System.IO.StreamWriter($fs1, [Text.Encoding]::Default);^
- $fs2=New-Object System.IO.FileStream('%output2%', [System.IO.FileMode]::Create);^
- $sw2=New-Object System.IO.StreamWriter($fs2, [Text.Encoding]::Default);^
- foreach($item in $dic.Keys){^
- $sw1.WriteLine($item);^
- if($dic[$item] -gt 1){$sw2.WriteLine('['+$dic[$item]+']'+$item)};^
- };^
- $sw1.Close();$fs1.Close();^
- $sw2.Close();$fs2.Close();
- echo;%info%
- pause
复制代码
作者: cfwyy77_bat 时间: 2019-7-5 08:25
awk差不多一行可以完事。- awk '{a[$0]+=1}END{for (i in a){print i >> "tmp1.txt";if (a[i]>1){printf("%s 出现%d次\n",i,a[i]) >> "tmp2.txt"}}}' list.txt
复制代码
作者: Batcher 时间: 2019-7-5 08:53
支持使用 gawk
http://bcn.bathome.net/s/tool/index.html?key=gawk- @echo off
- gawk "!a[$0]++" "list.txt" > "tmp1.txt"
- gawk "{a[$0]++}END{for(i in a)if(a[i]>1)printf(\"%%s 出现%%d次\n\",i,a[i])}" "list.txt" > "tmp2.txt"
复制代码
作者: gcbgczhang 时间: 2019-7-5 10:24
回复 4# Batcher
关键我是个菜鸟,很多年没写命令行了,gawk这是一个命令吗
作者: gcbgczhang 时间: 2019-7-5 10:29
我自己写的是这样,大脑有限只能记得这些了,目前暂时能用,但执行的不快。这个是拖入后直接排重计数
@echo off
set var=:
set /p var=拖入文件(请与本工具在同一文件夹)
echo %var%>tmp.txt
for /f "delims=*" %%i in (tmp.txt) do set "var=%%~nxi"
echo 0>tmp.txt>nul
for /f "delims=*" %%i in (%var%) do (
findstr "%%i" "tmp.txt">nul||echo %%i>>tmp.txt
)
del "排重%var%" >nul 2>nul
ren tmp.txt 排重%var%
::::下面是列出重复行及个数
@echo off
del "统计重复%var%" >nul 2>nul
for /f %%i in (排重%var%) do (
for /f %%j in ('type %var% ^| find "%%i" /c') do (
if %%j GTR 1 echo %%i有%%j次 >>统计重复%var%
))
pause
作者: Batcher 时间: 2019-7-5 11:40
回复 5# gcbgczhang
gawk是一个命令行工具,你打开4楼的连接把它下载下来和bat脚本放在一起就行了。
作者: gcbgczhang 时间: 2019-7-5 18:38
回复 7# Batcher
好的,我下载了,一会看看是什么功能
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |