找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 23201|回复: 3

[文本处理] [原创]批处理输出一个文本的重复行

[复制链接]
发表于 2012-1-2 09:20:59 | 显示全部楼层 |阅读模式
看到论坛内的都是 “去除文本的重复行”

因为有需要
又看到这个贴子:http://bbs.bathome.net/thread-14025-1-1.html

就自己写了个“输出一个文本的重复行”
话不多说
上代码:
  1. @echo off&setlocal ENABLEDELAYEDEXPANSION
  2. for /f "delims=" %%a in ('type Md5.txt') do (
  3.         if not defined %%a (
  4.                 set "%%a=a"
  5.         ) else (
  6.                 call set a=!!%%a!!
  7.                 if /i "!a!" neq "b" (
  8.                 set "%%a=b" & echo %%a
  9.                 )
  10.         )
  11. )
  12. pause
复制代码
遇到特殊字符 : ! 和 % 就报错了。。。

希望有人能发出更好的。。。
发表于 2012-1-2 14:24:02 | 显示全部楼层
首先,为了在背景条件未知的情况下使兼容性最大化,不建议用 if defined 的办法,因为等号是无法作为变量名的,所以容易误判。如改用 sort 的办法,虽然会慢一些,兼容性却好很多。
其次,适时关闭变量延迟有助于提高对特殊字符 ! 的兼容性,如:
  1. : test !tmp!
  2. @echo off
  3. for /f "delims=" %%a in (%~s0) do (
  4.    set str=%%a
  5.    set /a n+=1
  6.    setlocal enabledelayedexpansion
  7.    echo !n!:!str!
  8.    rem 如果写成 echo !n!:%%a,则会对 %%a 中的 !tmp!、!n!、!str! 进行解释
  9.    endlocal
  10. )
  11. pause
复制代码

最后,变量嵌套时,除非确定文本中不存在特殊字符,否则尽量不要用 call,容易丢失 &、|、<、>、% 等特殊字符,建议用 for 来中转:
  1. for /f "delims=" %%b in (""!%%a!"") do echo !%%~b!
  2. ::这里用 ""!%%a!"" 是避免当前行满足默认设置中的 eol=; 时被跳过
复制代码

评分

参与人数 1技术 +1 收起 理由
garyng + 1 学习学习~

查看全部评分

 楼主| 发表于 2012-1-4 09:26:31 | 显示全部楼层
回复 2# CrLf

学习学习!
我还是小菜鸟啊。。。
发表于 2012-1-4 13:41:55 | 显示全部楼层
  1. gawk "{!a[$0]++}END{for(i in a)if(a[i]>1)print i}" a.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:20 , Processed in 0.011837 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表