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

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

[复制链接]
 楼主| 发表于 2023-9-12 16:49:11 | 显示全部楼层
本帖最后由 娜美 于 2023-9-12 16:52 编辑

回复 15# 77七


    OK 漂亮, 谢谢哥哥
 楼主| 发表于 2023-9-12 19:08:07 | 显示全部楼层
本帖最后由 娜美 于 2023-9-12 19:28 编辑

回复 10# 77七
  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.                         set s2=
  38.                 )
  39.         )
  40.         endlocal
  41. )
  42. pause
  43. exit

  44. :1
  45. ::日期时间差 code by foxjl
  46. set date1=%~1
  47. set date2=%~2
  48. 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))
  49. 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))
  50. 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)
  51. exit /b
复制代码
好奇怪,  时间计算似乎有些问题,  秒的单位如果0开头秒数, 导致时间计算条件失效,  其他数字开头的时间都准确,   唯独秒数 0开头不准确
例,   时间条件不符合,


  1. 4        Jun 10, 2023 08:39:01.030724000 时间        1        4        6f89b2a23d4701b8eebabcf
  2. 6        Jun 10, 2023 08:39:05.898038000 时间        2        6        bb5c43db737f41
  3. 7        Jun 10, 2023 08:39:09.900620000 时间        3        7        6f89b2a23d4701b8eebabcf0
  4. 9        Jun 10, 2023 08:39:51.902646000 时间        9        9        1
复制代码
4        Jun 10, 2023 08:39:01.030724000 时间        1        4        6f89b2a23d4701b8eebabcf
6        Jun 10, 2023 08:39:05.898038000 时间        2        6        bb5c43db737f41
7        Jun 10, 2023 08:39:09.900620000 时间        3        7        6f89b2a23d4701b8eebabcf0
9        Jun 10, 2023 08:39:51.902646000 时间        9        9        1
发表于 2023-9-12 19:43:41 | 显示全部楼层
本帖最后由 77七 于 2023-9-12 19:57 编辑

回复 17# 娜美


  
  1. call :1 "2023-6-10 08:39:01" "2023-6-10 08:39:09"
  2. -1
复制代码
那个函数有问题,可能“过时了”,也可能是我使用方法有问题,难道要去0?
换了一个
  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 !DiffSecs! 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.                         set s2=
  38.                 )
  39.         )
  40.         endlocal
  41. )
  42. pause
  43. exit

  44. :1
  45. rem http://bbs.bathome.net/redirect.php?goto=findpost&ptid=11128&pid=70814
  46. set StartTime=%~1
  47. set EndTime=%~2
  48. set StartTime=%StartTime:-= %
  49. set StartTime=%StartTime::= %
  50. set EndTime=%EndTime:-= %
  51. set EndTime=%EndTime::= %
  52. call :DateToSecs %StartTime% StartSecs
  53. call :DateToSecs %EndTime% EndSecs
  54. set /a DiffSecs=EndSecs-StartSecs
  55. set DiffSecs=%DiffSecs:-=%
  56. goto :eof

  57. :DateToSecs %yy% %mm% %dd% %hh% %nn% %ss% secs
  58. setlocal ENABLEEXTENSIONS
  59. set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5&set ss=%6
  60. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  61. set /a dd=100%dd%%%100,mm=100%mm%%%100
  62. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  63. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  64. if 1%hh% LSS 20 set hh=0%hh%
  65. if {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
  66. if {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
  67. if {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
  68. set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
  69. set /a j=j*86400+hh*3600+nn*60+ss
  70. endlocal&set %7=%j%&goto :EOF
复制代码
发表于 2023-9-12 20:00:44 | 显示全部楼层
果然要去0才能准确调用。
 楼主| 发表于 2023-9-12 21:14:18 | 显示全部楼层
回复 18# 77七


    嗯嗯好了, 这个时间计算没bug   谢谢哥哥
发表于 2023-9-13 12:04:21 | 显示全部楼层
本帖最后由 hfxiang 于 2023-9-13 13:06 编辑

回复 1# 娜美
针对1楼的样本,用第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )脚本可以实现。
把所有的txt文件放置于同1个文件夹内,在命令行执行如下脚本(如果写在bat文件中,须注意百分号要双重,即(%%))

  1. gawk -F"\t+" -v"S= " "BEGIN{split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month, " ");for(i=1;i<=12;i++)m_digit[month[i]]=sprintf("%02d",i)}$3==1{a[1]=$0;b[1]=$5;split($2,t,"[ ,:.]+");t1=mktime(t[3] S m_digit[t[1]] S t[2] S t[4] S t[5] S t[6])"."t[7]}$3==2{if(a[1])a[2]=$0}$3==3{if(a[2]){split($2,t,"[ ,:.]+");t3=mktime(t[3] S m_digit[t[1]] S t[2] S t[4] S t[5] S t[6])"."t[7];if((b[1]!=$5)&&(t3-t1<=2)){print FILENAME;delete a;delete b;nextfile}}}$3>3{delete a;delete b}"  *.txt>txt.out
复制代码
另:
1.分隔符必须是tab(楼主最后补充中的1.txt是用8个空格分隔,不符合要求)
2.gawk的版本可能对结果输出会有影响,经测试4.1.0及5.2.2能通过,而5.1.0好像不出结果;
3.运行结束后,把txt.out改成out.txt即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 13:12 , Processed in 0.016263 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表