[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

看到论坛内的都是 “去除文本的重复行”

因为有需要
又看到这个贴子: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
复制代码
遇到特殊字符 : ! 和 % 就报错了。。。

希望有人能发出更好的。。。

首先,为了在背景条件未知的情况下使兼容性最大化,不建议用 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

评分人数

    • garyng: 学习学习~技术 + 1

TOP

回复 2# CrLf

学习学习!
我还是小菜鸟啊。。。

TOP

  1. gawk "{!a[$0]++}END{for(i in a)if(a[i]>1)print i}" a.txt
复制代码

TOP

返回列表