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

[文本处理] 请问BAT或PowerShell如何按符合时间条件比较列的数值?

请问如何按符合时间和条件比较列的数值

可请移步用源文件测
https://wwkt.lanzoul.com/iRSCa181yj6f
  1. 1.txt
  2. 1 Jun 10, 2023 08:39:51.019462000 时间 1 1 6f89b2a23d
  3. 2 Jun 10, 2023 08:39:51.021000000 时间 1 2 6f89b2a23d47
  4. 3 Jun 10, 2023 08:39:51.029190000 时间 1 3 6f89b2a23d4701b
  5. 4 Jun 10, 2023 08:39:51.030724000 时间 1 4 6f89b2a23d4701b8eebabcf
  6. 5 Jun 10, 2023 08:39:51.898038000 时间 2 5 bb5c43db737f41842ec
  7. 6 Jun 10, 2023 08:39:51.898038000 时间 2 6 bb5c43db737f41
  8. 7 Jun 10, 2023 08:39:51.900620000 时间 3 7 6f89b2a23d4701b8eebabc9
  9. 8 Jun 10, 2023 08:39:51.900620000 时间 3 8 6f89b2a23d4701
  10. 9 Jun 10, 2023 08:39:51.902646000 时间 4 9 00
  11. 10 Jun 10, 2023 08:40:01.081414000 时间 5 10 6f8
  12. 11 Jun 10, 2023 08:40:01.082950000 时间 6 11 6f89b
  13. 12 Jun 10, 2023 08:40:01.084486000 时间 7 12 6f
  14. 13 Jun 10, 2023 08:40:01.086022000 时间 0 13 6f89
  15. 4 Jun 10, 2023 08:39:51.030724000 时间 1 4 6f89b2a23d4701b8eebabcf
  16. 6 Jun 10, 2023 08:39:51.898038000 时间 2 6 bb5c43db737f41
  17. 7 Jun 10, 2023 08:39:51.900620000 时间 3 7 6f89b2a23d4701b8eebabcf
  18. 9 Jun 10, 2023 08:39:51.902646000 时间 9 9 00
  19. 2.txt
  20. 4 Jun 10, 2023 08:39:51.030724000 时间 1 4 6f89b2a23d4701b8eebabc0
  21. 6 Jun 10, 2023 08:39:51.898038000 时间 2 6 bb5c43db737f41
  22. 7 Jun 10, 2023 08:39:51.900620000 时间 3 7 6f89b2a23d4701b8eebabcf
  23. 9 Jun 10, 2023 08:39:51.902646000 时间 9 9 00
  24. 3.txt
  25. 4 Jun 10, 2023 08:39:51.030724000 时间 1 4 6f89b2a23d4701b8eebabc1
  26. 6 Jun 10, 2023 08:39:51.898038000 时间 2 6 bb5c43db737f41
  27. 7 Jun 10, 2023 08:39:55.900620000 时间 3 7 6f89b2a23d4701b8eebabc0
  28. 9 Jun 10, 2023 08:39:51.902646000 时间 9 9 00
  29. 5.txt
  30. 4 Jun 10, 2023 08:39:51.030724000 时间 3 4 6f89b2a23d4701b8eebabc0
  31. 6 Jun 10, 2023 08:39:51.898038000 时间 2 6 bb5c43db737f41
  32. 7 Jun 10, 2023 08:39:51.900620000 时间 1 7 6f89b2a23d4701b8eebabcf
  33. 9 Jun 10, 2023 08:39:51.902646000 时间 9 9 00
  34. 6.txt
  35. 4 Jun 10, 2023 08:39:51.030724000 时间 1 4 6f89b2a23d4701b8eebabc0
  36. 6 Jun 10, 2023 08:39:51.898038000 时间 0 6 bb5c43db737f41
  37. 7 Jun 10, 2023 08:39:51.900620000 时间 3 7 6f89b2a23d4701b8eebabcf
  38. 9 Jun 10, 2023 08:39:51.902646000 时间 9 9 00
复制代码
检查后得到这些文本名称结果
>out.txt
1.txt
2.txt


请 批量检查100多个类似文件
if 将 Tab "\t" 视作分隔符, 如果第3列 上 中 下 连续有 1|2|3 数字情况, 中间必须至少有一个有2,中间没有2跳过,则检查第2列的时间从最近的数值"1"行 , 至到数值"3" 的行时间是否在2秒之内,如果符合,则检查这2行数值"1"和数值"3"的行的第5列数值是否相同,如果检查到不相同,则需要输出记录该文件名称,

第3列中这种上 中 下有 1|2|3 数字排列是可能有很多行,也可能仅有2行或3行情况,只取距离最近数值"1"行和有数值"3"行的第5列数值比较是否相同就行, 但他们中间必须至少有一个有2 否则条件不符合

时间精确到秒就行, 当然能精确计算到纳秒也行
符合的3个条件:
如果第3列符合条件: 其上 中 下行, 顺序必须有 1|2|3 , 中间可以有连续多个2的行, 但不能是其他数字, 但不能是其他数字
如果数值"1"行至到数值"3" 的行时间符合在2秒内, 秒的数字最好可手动更改
如果都符合以上条件, 则需要检查数值"1"和数值"3"的这2行的第5列数值是否相同,如果检查到不相同,则需要输出记录该文件名称,
All is UTF-8编码文本

bat ps1 shell 都行 Thanks



深入补充一些有助于理解说明
按第2列的时间是否符合和第3列条件是否符合, 从而比较第5列的数值是否相同

如果第3列条件符合: 即可以匹配其上 中 下行, 顺序是有 1,2,3数字, 中间可以有连续多个2的行, 但不能是其他数字
如果第3列数值"1"行至到数值"3" 的行时间符合在2秒内, 秒的数字最好可手动更改
如果都符合以上条件, 则需要检查数值"1"和数值"3"的这2行的第5列数值是否相同,如果检查到不相同,则需要输出记录该文件名称

像这样的第2列时间,   第3列数值, 1到3之中只有2  或多个2都行, 他们条件都符合,    他们对应的第5列数值也不同,   
第3列 如果有连续发生多个"1"和多个"3" 的行情况,  取距离最近的数值"1"和数值"3" 的行来处理计算为准
1.txt
1        Jun 10, 2023 08:39:51.019462000 时间        1        1        6f89b2a23d
2        Jun 10, 2023 08:39:51.021000000 时间        1        2        6f89b2a23d47
3        Jun 10, 2023 08:39:51.029190000 时间        1        3        6f89b2a23d4701b
4        Jun 10, 2023 08:39:51.030724000 时间        1        4        6f89b2a23d4701b8eebabcf
5        Jun 10, 2023 08:39:51.898038000 时间        2        5        bb5c43db737f41842ec
6        Jun 10, 2023 08:39:51.898038000 时间        2        6        bb5c43db737f41
7        Jun 10, 2023 08:39:51.900620000 时间        3        7        6f89b2a23d4701b8eebabc9
8        Jun 10, 2023 08:39:51.900620000 时间        3        8        6f89b2a23d4701
9        Jun 10, 2023 08:39:51.902646000 时间        4        9        00
10        Jun 10, 2023 08:40:01.081414000 时间        5        10        6f8
11        Jun 10, 2023 08:40:01.082950000 时间        6        11        6f89b
12        Jun 10, 2023 08:40:01.084486000 时间        7        12        6f
13        Jun 10, 2023 08:40:01.086022000 时间        0        13        6f89

所以该文件应在输出文件中标注
>out.txt
1.txt

本帖最后由 娜美 于 2023-9-11 21:50 编辑

在这里添加多一些不符合条件例吧, 主题不再编辑了, 害怕整乱了,
第3列的数字"1" 至数字"3"  中间必须只能是2, 其中可以有很多行 也可以只有1行是"2"    但不能是其它数字

  1. 7.txt
  2. 4        Jun 10, 2023 08:39:51.030724000 时间        1        4        6f89b2a23d4701b8eebabcf
  3. 5        Jun 10, 2023 08:39:51.898038000 时间        2        5        bb5c43db737f41842ec
  4. 6        Jun 10, 2023 08:39:51.898038000 时间        9        6        bb5c43db737f41
  5. 7        Jun 10, 2023 08:39:51.900620000 时间        3        7        6f89b2a23d4701b8eebabc9
复制代码

TOP

1楼的文本 时间后面紧跟着一个 tab,提供的压缩包内文本,时间后是空格。
bat小白,请多指教!谢谢!

TOP

回复 3# 77七


   提供的压缩包内文本我又重新仔细检查过  时间后面确认是Tab键符哦, 不是空格,     不知道为什么会发生这种情况的,   如果时间后面紧跟的是空格情况是不对的, 请将变成是Tab "\t" 键符 即可

TOP

额,看不懂

最好给个执行后的结果

TOP

回复 4# 娜美
是我看错了,我这里显示的 tab 非常短
bat小白,请多指教!谢谢!

TOP

本帖最后由 娜美 于 2023-9-12 07:58 编辑

回复 5# Five66


   Sorry,你图像好模糊, 标注的字似乎很难看的清

如果第3列条件符合: 即可以匹配其上 中 下行, 顺序是有 1,2,3数字, 中间可以有连续多个2的行, 但不能是其他数字
如果第3列数值"1"行至到数值"3" 的行时间符合在2秒内, 秒的数字最好可手动更改
如果都符合以上条件, 则需要检查数值"1"和数值"3"的这2行的第5列数值是否相同,如果检查到不相同,则需要输出记录该文件名称,

像这样的第2列时间,   第3列数值, 1到3之中只有2  或多个2都行, 他们条件都符合,    他们对应的第5列数值也不同,   
1.txt
1        Jun 10, 2023 08:39:51.019462000 时间        1        1        6f89b2a23d
2        Jun 10, 2023 08:39:51.021000000 时间        1        2        6f89b2a23d47
3        Jun 10, 2023 08:39:51.029190000 时间        1        3        6f89b2a23d4701b
4        Jun 10, 2023 08:39:51.030724000 时间        1        4        6f89b2a23d4701b8eebabcf
5        Jun 10, 2023 08:39:51.898038000 时间        2        5        bb5c43db737f41842ec
6        Jun 10, 2023 08:39:51.898038000 时间        2        6        bb5c43db737f41
7        Jun 10, 2023 08:39:51.900620000 时间        3        7        6f89b2a23d4701b8eebabc9
8        Jun 10, 2023 08:39:51.900620000 时间        3        8        6f89b2a23d4701
9        Jun 10, 2023 08:39:51.902646000 时间        4        9        00
10        Jun 10, 2023 08:40:01.081414000 时间        5        10        6f8
11        Jun 10, 2023 08:40:01.082950000 时间        6        11        6f89b
12        Jun 10, 2023 08:40:01.084486000 时间        7        12        6f
13        Jun 10, 2023 08:40:01.086022000 时间        0        13        6f89

所以该文件应在输出文件中标注
>out.txt
1.txt

TOP

回复 7# 娜美


    这样应该清晰点了吧

TOP

本帖最后由 娜美 于 2023-9-12 08:10 编辑

回复 8# Five66


    嗯清晰了一些,   不是取出行哦,  而是在符合这些条件下, 比较第5列数值是否相同


第3列 如果有连续发生多个"1"和多个"3" 的行情况,  取距离最近的数值"1"和数值"3" 的行来处理计算为准,   中间的2有多少行为数值"2"不用管, 1和3中间但至少要有一行是数值"2"  ,  1和3中间除了是2,  不能有其他数字


如第3列有如下情况

1
1
2
3
3
5
在主题已增补一些说明, 请回看主题目

TOP

本帖最后由 77七 于 2023-9-12 11:49 编辑
  1. @echo off
  2. chcp 65001 >nul
  3. rem 批处理保存为utf-8编码格式
  4. set /a m=n=2
  5. set /a "Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12"
  6. for /f "delims=" %%x in ('dir /b /a-d *.txt') do (
  7. setlocal enabledelayedexpansion
  8. for /f "useback tokens=1-9* delims=,. " %%a in ("%%x") do (
  9. if %%h equ 1 (
  10. set t1=%%d-!%%b!-%%c %%e
  11. set t2=%%f
  12. set ss1=%%j
  13. set s2=
  14. ) else if %%h equ 2 (
  15. if defined ss1 (
  16. set s2=1
  17. )
  18. ) else if %%h equ 3 (
  19. if defined s2 (
  20. call :1 "!t1!" "%%d-!%%b!-%%c %%e"
  21. if "%%f" geq "!t2!" (
  22. set /a m=n-1
  23. )
  24. if !secs! leq !m! (
  25. if "!ss1!" neq "%%j" (
  26. if not defined _"%%x" (
  27. >>out.txt echo %%x
  28. set _"%%x"=1
  29. )
  30. )
  31. )
  32. set ss1=
  33. set s2=
  34. )
  35. ) else (
  36. set ss1=
  37. )
  38. )
  39. endlocal
  40. )
  41. pause
  42. exit
  43. :1
  44. ::日期时间差 code by foxjl
  45. set date1=%~1
  46. set date2=%~2
  47. for /f "tokens=1,2,3,4,5,6,7 delims=-/:. " %%i in ("%date1%") do ((set Y1=%%i) && (set M1=%%j) && (set D1=%%k) && (set H1=%%l) && (set F1=%%m) && (set S1=%%n) && (set MS1=%%o))
  48. for /f "tokens=1,2,3,4,5,6,7 delims=-/:. " %%i in ("%date2%") do ((set Y2=%%i) && (set M2=%%j) && (set D2=%%k) && (set H2=%%l) && (set F2=%%m) && (set S2=%%n) && (set MS2=%%o))
  49. set /a secs=((d2-32075+1461*(y2+4800+(m2-14)/12)/4+367*(m2-2-(m2-14)/12*12)/12-3*((y2+4900+(m2-14)/12)/100)/4)*86400+H2*3600+F2*60+S2)-((d1-32075+1461*(y1+4800+(m1-14)/12)/4+367*(m1-2-(m1-14)/12*12)/12-3*((y1+4900+(m1-14)/12)/100)/4)*86400+H1*3600+F1*60+S1)
  50. exit /b
复制代码

不知道对不对
bat小白,请多指教!谢谢!

TOP

本帖最后由 娜美 于 2023-9-12 11:27 编辑

回复 10# 77七


    谢谢
哥哥的理解基本正确, 但似乎少了一种条件
如果笫2列时间符合,  如果笫3列条件也符合  但笫5列对应他们行的数值如果相同情况, 则不用输出,  不相同的数值才需要记录文件名

像下面的情况,  笫2列时间虽然符合了,  笫3列条件也符合, 但笫5列对应他们行的数值是相同的, 则不用输出

  4        Jun 10, 2023 08:39:51.030724000 时间        1        4        6f89b2a23d4701b8eebabcf
6        Jun 10, 2023 08:39:51.898038000 时间        2        6        bb5c43db737f41
7        Jun 10, 2023 08:39:51.900620000 时间        3        7        6f89b2a23d4701b8eebabcf
8        Jun 10, 2023 08:39:51.900620000 时间        7        0        6f89b2a23d4701b8eebabcf0

TOP

回复 11# 娜美


   s1和子函数的s1变量冲突导致错误,已修改。
bat小白,请多指教!谢谢!

TOP

本帖最后由 娜美 于 2023-9-12 14:09 编辑

回复 12# 77七

嗯嗯,  哥哥  第3列条件只有一点点小问题, 这种情况不知道能否作出判断
   第3列的数值"1" 到"3" 中间只能是  "2" 可以允许有多个"2" 连续的行,  但中间不能允许有其他数字, 否则不符合条件



例, 数值"1" 到"3" 中间 只能是"2"   但是出现了数值 "9"的行   是不符合条件的 ,  

4        Jun 10, 2023 08:39:51.030724000 时间        1        4        6f89b2a23d4701b8eebabcf
6        Jun 10, 2023 08:39:51.898038000 时间        2        6        bb5c43db737f41
7        Jun 10, 2023 08:39:51.898038000 时间        9        6        bb5c43db737f41
8        Jun 10, 2023 08:39:51.900620000 时间        3        7        6f89b2a23d4701b8eebabcf
9        Jun 10, 2023 08:39:51.900620000 时间        3        7        6f89b2a23d4701b8eebabcf

TOP

本帖最后由 Five66 于 2023-9-12 15:58 编辑

不知道是不是这样子?保存为bat或cmd
仔细想想会覆盖非2的行,已编辑

TOP

回复 13# 娜美


   36行下添加一行
  1. set s2=
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表