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

[文本处理] [已解决]批处理如何提取文本中第二列的数字数据小于之后其他列的行

本帖最后由 pcl_test 于 2017-3-19 16:25 编辑

求助如何筛选按我要求的行的数据txt
txt格式样式
                 第二行数   第三行数    第四行数    第五行数   第六行数
603022        111        666        777        888        999
300017        811        666        777        888        999
000002        555        666        777        888        999
000877        999        666        777        888        999
600760        888        666        777        888        999
300304        333        666        777        888        999
603300        777        666        777        888        999
300104        700        666        777        888        999
002164        800        666        777        888        999
600577        900        666        777        888        999
我想知道
如何筛选出  第列行数小于第三列数 同时 第二列数也小于第四列数 同时 第二列数也小于第五行数 同时 第二列数也小于第六列数
意思也就是只留下 第二列数 比之后几列数字都小的行  这个行一共有10行  我搞了个例子 只搞了6行
麻烦知道的朋友告诉我下 谢谢


筛选剩下的 就应该是
603022        111        666        777        888        999
000002        555        666        777        888        999
300304        333        666        777        888        999
就剩下这3行了
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

非常感谢各位 问题解决了 ! 太谢谢了!
我是技术小白 我来求助 真希望有天我也能成为技术大牛

TOP

一种解法:
  1. @echo off
  2. (for /f "delims=" %%a in (a.txt) do (
  3.     for /f "tokens=1-6" %%b in ("%%a") do (
  4.         set /a "flag=(%%d0-%%c0|%%e0-%%c0|%%f0-%%c0|%%g0-%%c0)>>31, 1/flag" || echo %%a
  5.     )
  6. ))>b.txt 2>nul
  7. pause
复制代码
如列数超过31个,不适用
如数字大于 2亿,不适用
1

评分人数

TOP

  1. @echo off
  2. (for /f "tokens=1,2*" %%a in (a.txt) do (
  3.     setlocal
  4.     for %%i in (%%c) do if %%b geq %%i set f=1
  5.     if not defined f echo %%a        %%b        %%c
  6.     endlocal
  7. ))>b.txt
  8. pause
复制代码

TOP

回复 13# pcl_test


    感谢版主指导

TOP

本帖最后由 pcl_test 于 2017-3-16 12:44 编辑

回复 12# taofan712

因为楼主测试的是他自己的6列数据,那么你处理10列的代码就会输出空行,另外直接sort排序获取其他列中的最小值也不妥,如xx 12 141 101 11 130
这类问题用纯批并不能做到很通用,要考虑的问题较多,如以整数型比较,会有有效范围的限制,以字符串比较,会有排序的问题,如果还有负数和小数,要处理的问题就更多了
  1. @powershell "gc '文本.txt'|%%{$a=$_ -split '\s+';$b=($a[2..($a.count-1)]|measure -min).minimum;if(1*$a[1] -lt $b){$_}}"&pause
复制代码

TOP

回复 8# 2359123467


    不会有错,我是按照10列来写,并测试过的。当然,他们的脚本比我的好太多了。

TOP

回复 8# 2359123467


有什么报错信息?
还是得到的结果跟你的预期有什么差异?
请给出详细的反馈,否则人家也不知道如何继续帮你改代码。

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (a.txt) do (
  3. set m=&set "n="&set "s="
  4. for %%a in (%%i) do (
  5. if defined m (
  6. if defined n (
  7. if !n! gtr %%a set s=1
  8. ) else set n=%%a
  9. ) else set m=%%a
  10. )
  11. if not defined s echo;%%i
  12. ))>b.txt
  13. pause & exit /b
复制代码
1

评分人数

人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

  1. //&cls&cscript -nologo -e:jscript "%~f0"<"a.txt">"b.txt"&pause&exit
  2. while(!WSH.StdIn.AtEndOfStream){
  3.     var line=WSH.StdIn.ReadLine(), arr=line.split(/\s+/), len=arr.length;
  4.     if(len>2){
  5.         var n=0;for(var i=2;i<len;i++){if(1*arr[1]<arr[i])n++}
  6.         if(n==len-2)WSH.echo(line);
  7.     }
  8. }
复制代码

TOP

回复 6# taofan712


    这个测试了 不能用 但是也非常感谢您

TOP

回复 5# /zhqsystem/zhq


   谢谢 测试可用  就是能不能帮上筛选出来的搞个b.txt结果存放  万分谢谢

TOP

本帖最后由 taofan712 于 2017-3-16 00:27 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=1-10" %%a in (a.txt) do (
  3.   (echo;%%c
  4.   echo;%%d
  5.   echo;%%e
  6.   echo;%%f
  7.   echo;%%g
  8.   echo;%%h
  9.   echo;%%i
  10.   echo;%%j
  11.   )>t1.tmp
  12.   sort t1.tmp>t2.tmp
  13.   set/p aa=<t2.tmp
  14.   for /f %%x in ("!aa!") do (
  15.     if %%b lss %%x echo;%%a  %%b  %%c  %%d  %%e  %%f  %%g %%h %%i %%j
  16.   )>>newa.txt
  17. )
  18. del /f /q t?.tmp
  19. pause
复制代码

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('type ".\新建文本文档.txt"')do (
  3. set "loop=%%i"
  4. for /l %%n in (1,1,11)do if defined loop for /f "tokens=1,* delims=分割符" %%y in ("!loop!")do set "loop=%%z"&set "loop_%%~nn=%%y"
  5. set "_if="
  6. for /l %%n in (3,1,6)do if !loop_2! lss !loop_%%n! set "_if=!_if!%%n"
  7. if /i "!_if!"=="3456" echo,%%i
  8. )
  9. pause
复制代码
1

评分人数

    • taofan712: 好难看你出一次手。技术 + 1
这么好的论坛你上哪找,运行测试环境为6.1.7601-64
注:请遵守互联网信息安全,勿用于非法用途

TOP

回复 3# taofan712


    恩  txt中就是打个比方  我现在去修改修改

TOP

返回列表