Board logo

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

作者: 2359123467    时间: 2017-3-15 02:16     标题: [已解决]批处理如何提取文本中第二列的数字数据小于之后其他列的行

本帖最后由 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行了
作者: 2359123467    时间: 2017-3-15 12:42

有没有知道的兄弟啊 告诉我下 谢谢拉
作者: taofan712    时间: 2017-3-15 12:49

回复 2# 2359123467

你是说的第二"列"吧 ?但是我看你第二列没有比后面的任何一列更小。
作者: 2359123467    时间: 2017-3-15 23:32

回复 3# taofan712


    恩  txt中就是打个比方  我现在去修改修改
作者: /zhqsystem/zhq    时间: 2017-3-16 00:24

  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
复制代码

作者: taofan712    时间: 2017-3-16 00:25

本帖最后由 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
复制代码

作者: 2359123467    时间: 2017-3-16 01:24

回复 5# /zhqsystem/zhq


   谢谢 测试可用  就是能不能帮上筛选出来的搞个b.txt结果存放  万分谢谢
作者: 2359123467    时间: 2017-3-16 01:25

回复 6# taofan712


    这个测试了 不能用 但是也非常感谢您
作者: pcl_test    时间: 2017-3-16 08:12

  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. }
复制代码

作者: 回家路上    时间: 2017-3-16 09:03

  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
复制代码

作者: GNU    时间: 2017-3-16 09:45

回复 8# 2359123467


有什么报错信息?
还是得到的结果跟你的预期有什么差异?
请给出详细的反馈,否则人家也不知道如何继续帮你改代码。
作者: taofan712    时间: 2017-3-16 09:49

回复 8# 2359123467


    不会有错,我是按照10列来写,并测试过的。当然,他们的脚本比我的好太多了。
作者: pcl_test    时间: 2017-3-16 11:02

本帖最后由 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
复制代码

作者: taofan712    时间: 2017-3-16 11:28

回复 13# pcl_test


    感谢版主指导
作者: terse    时间: 2017-3-16 11:45

  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
复制代码

作者: CrLf    时间: 2017-3-16 15:40

一种解法:
  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亿,不适用
作者: 2359123467    时间: 2017-3-17 15:20

非常感谢各位 问题解决了 ! 太谢谢了!




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