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

TOP

本帖最后由 newswan 于 2021-10-4 13:41 编辑

用了第三方命令 sed
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set sour=aaa
  4. set dest=bbb
  5. del %dest%\*.txt
  6. set exclude=20210226
  7. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  8.     sed -r -n -e "/\w+\s+\w+\s+\w+/p" -e "/%exclude%/d" "%%~fa">> "%dest%\%%~na.txt"
  9. )
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.txt"`) do (
  11.     set _file_=%%~fa
  12.     for /f "usebackq tokens=* delims=" %%a in ("%_file_%") do (
  13.         set __%%a=%%a
  14.     )
  15.    
  16.     (
  17.         for /f "usebackq tokens=2 delims==" %%a in (`set __`) do (
  18.             echo %%a
  19.         )
  20.     ) > "%_file_%"
  21.     rem notepad"%_file_%"
  22. )
复制代码
1

评分人数

    • PCL0769: 高技术 高人品技术 + 1

TOP

findstr 支持正则太差,所以用了sed

TOP

本帖最后由 newswan 于 2021-10-4 13:44 编辑

回复 6# PCL0769


可能 没有 sed
论坛里下载一个,放到 c:\windows
http://www.bathome.net/thread-36408-1-1.html

TOP

TOP

我测试正确的,你自己调试一下

set sour=aaa    源路径
set dest=bbb    目的路径

set exclude=20210226   排除列表

TOP

本帖最后由 newswan 于 2021-10-4 15:34 编辑
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set sour=C:\Users\admin\Desktop\New folder (2)\aaa
  4. set dest=C:\Users\admin\Desktop\New folder (2)\bbb
  5. set exclude=20210226
  6. del "%dest%\*.txt"
  7. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  8.     sed -r -n -e "/\w+\s+\w+\s+\w+/p" -e "/%exclude%/d" "%%~fa">> "%dest%\%%~na.txt"
  9. )
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.txt"`) do (
  11.     for /f "usebackq tokens=* delims=" %%a in ("%%~fa") do (
  12.         set __%%a=%%a
  13.     )
  14.    
  15.     (
  16.         for /f "usebackq tokens=2 delims==" %%a in (`set __`) do (
  17.             echo %%a
  18.         )
  19.     ) > "%%~fa"
  20.     notepad.exe "%%~fa"
  21. )
复制代码
1

评分人数

    • PCL0769: 高技术 高人品技术 + 1

TOP

本帖最后由 newswan 于 2021-10-4 15:32 编辑

powershell 好一些
  1. $sour = "aaa"
  2. $dest = "bbb"
  3. $exclude = "20210227"
  4. Remove-Item $dest\*.txt
  5. Get-ChildItem -path $sour *.txt -Recurse | foreach-object {
  6.     ( get-content $_.fullname ) -match "\w+\s+\w+\s+[-]?\w+" -notmatch $exclude | out-file -append $dest\$_
  7. }
  8. Get-ChildItem -path $dest *.txt | foreach-object {
  9.     $a = get-content $_.fullname | sort-object -unique
  10.     $a | out-file $dest\$_
  11.     notepad.exe $dest\$_
  12. }
复制代码
1

评分人数

    • PCL0769: 高技术 高人品技术 + 1

TOP

本帖最后由 newswan 于 2021-10-4 15:37 编辑

目录是这样的
  1. ├───aaa
  2. │   ├───01
  3. │   └───02
  4. └───bbb
复制代码
刚才 网站 拒绝登陆

TOP

本帖最后由 newswan 于 2021-10-4 16:08 编辑

回复 15# qixiaobin0715


欠考虑,如果是单文件去重,需要清除变量

谢谢!!!

TOP

本帖最后由 newswan 于 2021-10-4 18:52 编辑
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set sour=C:\Users\admin\Desktop\New folder (2)\aaa
  4. set dest=C:\Users\admin\Desktop\New folder (2)\bbb
  5. set exclude=20210226
  6. del "%dest%\*.txt"
  7. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  8.     sed -r -n -e "/\w+\s+\w+\s+\w+/p" -e "/%exclude%/d" "%%~fa">> "%dest%\%%~na.txt"
  9. )
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.txt"`) do (
  11.     for /f "usebackq tokens=2 delims==" %%a in (`set __ 2^>nul`) do (
  12.         set %%a=
  13.     )
  14.     for /f "usebackq tokens=* delims=" %%a in ("%%~fa") do (
  15.         set __%%a=1
  16.     )
  17.    
  18.     (
  19.         for /f "usebackq tokens=2 delims==" %%a in (`set __`) do (
  20.             echo %%a
  21.         )
  22.     ) > "%%~fa"
  23.     notepad.exe "%%~fa"
  24. )
复制代码
1

评分人数

    • PCL0769: 谢谢老师出手帮助!高技术!高人品!技术 + 1

TOP

我这里运行是正确的,你自己调试吧

TOP

回复 20# PCL0769


数据量很大,powershell 效率高些
  1. $sour = "D:\share\tech\New folder (2)\aaa"
  2. $dest = "D:\share\tech\New folder (2)\ccc"
  3. $exclude = "20210227"
  4. Remove-Item $dest\*.txt
  5. get-date
  6. Get-ChildItem -path $sour *.txt -Recurse | foreach-object {
  7.     $_.fullname
  8.     ( get-content $_.fullname ) -match "\w+\s+\w+\s+[-]?\w+" -notmatch $exclude -replace "SZ","1" -replace "SH","0" -replace "\s+","|" | out-file -append $dest\$_
  9. }
  10. get-date
  11. Get-ChildItem -path $dest *.txt | foreach-object {
  12.     $_.fullname
  13.     $a = get-content $_.fullname | sort-object -unique
  14.     $a | out-file $dest\$_
  15. }
  16. get-date
复制代码
1

评分人数

    • PCL0769: 谢谢老师出手帮助!高技术!高人品!技术 + 1

TOP

本帖最后由 newswan 于 2021-10-5 00:56 编辑

回复 24# PCL0769

使用 powershell 看这里
http://www.bathome.net/thread-59270-1-1.html

如果批处理,用第三方命令 sort 排序去重,效率高。
  1. ├───aaa    <--- 数据源
  2.      ├───01
  3.      └───02
复制代码

TOP

本帖最后由 newswan 于 2021-10-5 12:23 编辑

回复 26# qixiaobin0715

去重 效率比较
gnu:sort = vbs > powershell > 批处理

第三方命令,有的和  windows 自带命令重名
第三方命令保存到单独目录,然后把这个路径添加到 %path% 的前面部分
比如
  1. set Path=C:\msys64\usr\bin;%Path%
复制代码

TOP

返回列表