Board logo

标题: [文本处理] [已解决]批处理怎样把txt文本根据每行部分内容匹配去重 [打印本页]

作者: lantern    时间: 2015-1-17 07:36     标题: [已解决]批处理怎样把txt文本根据每行部分内容匹配去重

txt文件
  1. 列A 列B 列C 列D
  2. 1.2.3.4 56 字符串 字符串
  3. 5.6.7.8 99 字符串 字符串
  4. 2.3.4.5 56 字符串 字符串
  5. 6.7.8.9 99 字符串 字符串
  6. 1.2.3.4 76 字符串 字符串
  7. 5.6.7.8 45 字符串 字符串
复制代码
列A为主对比项,列B为次对比项
列A无相同行时,保留这一行
列A有相同行时,保留列B数值较小的那一行
这样的去重bat能搞吗?谢谢
作者: tmplinshi    时间: 2015-1-17 14:03

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1,2,*" %%a in ('sort a.txt') do (
  4.     if "%%a" neq "!last_col1!" (
  5.         if defined last_col1 (
  6.             echo !full_line!
  7.         )
  8.         set last_col1=%%a
  9.         set n=%%b
  10.         set full_line=%%a    %%b    %%c
  11.     ) else (
  12.         if %%b lss !n! (
  13.             set n=%%b
  14.             set full_line=%%a    %%b    %%c
  15.         )
  16.     )
  17. )) >result.txt
复制代码

作者: lantern    时间: 2015-1-17 15:09

回复 2# tmplinshi
多谢。
有个问题:处理的结果少一行。
txt
  1. 1.2.3.4        56        字符串        字符串
  2. 5.6.7.8        99        字符串        字符串
  3. 2.3.4.5        56        字符串        字符串
  4. 6.7.8.9        99        字符串        字符串
  5. 1.2.3.4        76        字符串        字符串
  6. 5.6.7.8        45        字符串        字符串
复制代码
输出的结果是
  1. 1.2.3.4    56    字符串        字符串
  2. 2.3.4.5    56    字符串        字符串
  3. 5.6.7.8    45    字符串        字符串
复制代码
少了“6.7.8.9        99        字符串        字符串”这一行,我用一个大文件运行了一下,列A去重后是22646行,但result.txt只有22645行
另外还有下面一种情况:
1.2.3.4
1.2.3.4        76        字符串        字符串
1.2.3.4        45        字符串        字符串
就是列A相同,列B  列C  列D有可能为空,想保留不为空且列B数值较小的这一行该怎么弄,谢谢。
作者: tmplinshi    时间: 2015-1-17 18:31

回复 3# lantern
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (
  4.     for /f "tokens=1,2,*" %%a in ('sort a.txt') do (
  5.         if "%%a" neq "!last_col1!" (
  6.             if defined last_col1 (
  7.                 echo !full_line!
  8.                 set finishedCol1=!last_col1!
  9.             )
  10.             set last_col1=%%a
  11.             set n=%%b
  12.             if "!n!" == "" (set n=空)
  13.             set full_line=%%a    !n!    %%c
  14.         ) else (
  15.             if %%b lss !n! (
  16.                 set n=%%b
  17.                 set full_line=%%a    %%b    %%c
  18.             )
  19.         )
  20.     )
  21.    
  22.     if "!finishedCol1!" neq "!last_col1!" (
  23.         echo !full_line!
  24.     )
  25. ) >result.txt
复制代码

作者: lantern    时间: 2015-1-17 19:46

回复 4# tmplinshi
这次OK了,多谢斑竹!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2