标题: [文本处理] [已解决]批处理如何提取文本中第二列的数字数据小于之后其他列的行 [打印本页]
作者: 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
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('type ".\新建文本文档.txt"')do (
- set "loop=%%i"
- 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"
- set "_if="
- for /l %%n in (3,1,6)do if !loop_2! lss !loop_%%n! set "_if=!_if!%%n"
- if /i "!_if!"=="3456" echo,%%i
- )
- pause
复制代码
作者: taofan712 时间: 2017-3-16 00:25
本帖最后由 taofan712 于 2017-3-16 00:27 编辑
- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1-10" %%a in (a.txt) do (
- (echo;%%c
- echo;%%d
- echo;%%e
- echo;%%f
- echo;%%g
- echo;%%h
- echo;%%i
- echo;%%j
- )>t1.tmp
- sort t1.tmp>t2.tmp
- set/p aa=<t2.tmp
- for /f %%x in ("!aa!") do (
- if %%b lss %%x echo;%%a %%b %%c %%d %%e %%f %%g %%h %%i %%j
- )>>newa.txt
- )
- del /f /q t?.tmp
- 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
- //&cls&cscript -nologo -e:jscript "%~f0"<"a.txt">"b.txt"&pause&exit
- while(!WSH.StdIn.AtEndOfStream){
- var line=WSH.StdIn.ReadLine(), arr=line.split(/\s+/), len=arr.length;
- if(len>2){
- var n=0;for(var i=2;i<len;i++){if(1*arr[1]<arr[i])n++}
- if(n==len-2)WSH.echo(line);
- }
- }
复制代码
作者: 回家路上 时间: 2017-3-16 09:03
- @echo off & setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (a.txt) do (
- set m=&set "n="&set "s="
- for %%a in (%%i) do (
- if defined m (
- if defined n (
- if !n! gtr %%a set s=1
- ) else set n=%%a
- ) else set m=%%a
- )
- if not defined s echo;%%i
- ))>b.txt
- 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
这类问题用纯批并不能做到很通用,要考虑的问题较多,如以整数型比较,会有有效范围的限制,以字符串比较,会有排序的问题,如果还有负数和小数,要处理的问题就更多了- @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
- @echo off
- (for /f "tokens=1,2*" %%a in (a.txt) do (
- setlocal
- for %%i in (%%c) do if %%b geq %%i set f=1
- if not defined f echo %%a %%b %%c
- endlocal
- ))>b.txt
- pause
复制代码
作者: CrLf 时间: 2017-3-16 15:40
一种解法:- @echo off
- (for /f "delims=" %%a in (a.txt) do (
- for /f "tokens=1-6" %%b in ("%%a") do (
- set /a "flag=(%%d0-%%c0|%%e0-%%c0|%%f0-%%c0|%%g0-%%c0)>>31, 1/flag" || echo %%a
- )
- ))>b.txt 2>nul
- pause
复制代码
如列数超过31个,不适用
如数字大于 2亿,不适用
作者: 2359123467 时间: 2017-3-17 15:20
非常感谢各位 问题解决了 ! 太谢谢了!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |