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

[其他] 【已解决】批处理如何将多行命令合成一组,提高运行效率

主题如下,重复了,故删除。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 14# dos-a


    for 的写法已经有人了,只需要改改参数就行了

TOP

回复 2# 思想之翼


    直接for加start /b

TOP

本帖最后由 思想之翼 于 2023-4-15 12:42 编辑

回复 12# hfxiang
感谢!经测试,该代码计算7个文本,共耗时11厘秒,耗时最少。

TOP

回复 10# 思想之翼

试试以下脚本(针对新的要求,把“sub(/^d:/,\"e:\",f)”改为“sub(/^d:\\HY/,\"e:\\HY\\01\",f)”):
  1. @gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND]=a[ARGIND]==\"\"?$2:a[ARGIND] \"\n\" $2;next}}{b[$0]++}END{for(i=2;i<=ARGIND;i++){ if(a[i]){f=ARGV[i];sub(/^d:\\HY/,\"e:\\HY\\01\",f);print(a[i])>f}}}" "e:\ZD\01\000001\000001_1.txt" d:\HY\000001\000001_1.txt
复制代码
1

评分人数

TOP

回复 9# 思想之翼
是不是这样?
  1. @echo off&setlocal enabledelayedexpansion
  2. rem 文件编码为ansl
  3. for /l %%a in (1,1,1000) do (
  4.      set "p=00000%%a"
  5.      set p=!p:~-6!
  6.      if exist "d:\HY\!p!\" (
  7.         for /l %%b in (1,1,7) do (
  8.              if exist "d:\HY\!p!\!p!_%%b.txt" (
  9.                 gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND]=a[ARGIND]==\"\"?$2:a[ARGIND] \"\n\" $2;next}}{b[$0]++}END{for(i=2;i<=ARGIND;i++){ if(a[i]){f=ARGV[i];sub(/^d:\\[^^\\]+\\/,\"e:\\HY\\0%%b\\\\\",f);print(a[i])>f}}}" "e:\ZD\01\!p!\!p!_%%b.txt" "d:\HY\!p!\!p!_%%b.txt"
  10.             )
  11.        )
  12.     )
  13. )
  14. pause
复制代码
1

评分人数

TOP

回复 8# hfxiang

字典文本:d:\HY\000001\000001_1.txt
待替换文本:e:\ZD\01\000001\000001_1.txt
希望输出的结果文本:e:\HY\01\000001\000001_1.txt

您的代码 输出结果是:e:\HY\000001\000001_1.txt  恳望指点

TOP

本帖最后由 思想之翼 于 2023-4-14 14:21 编辑

回复 7# terse
感谢帮助!部分正则代码,几经尝试修改,仍无果而终。

字典文本:d:\HY\000001\000001_1.txt
待替换文本:e:\ZD\01\000001\000001_1.txt
希望输出结果文本:e:\HY\01\000001\000001_1.txt

下述代码输出结果是:e:\HY\000001\000001_1.txt  如何修改,恳望指点。
  1. @gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND]=a[ARGIND]==\"\"?$2:a[ARGIND] \"\n\" $2;next}}{b[$0]++}END{for(i=2;i<=ARGIND;i++){ if(a[i]){f=ARGV[i];sub(/^d:/,\"e:\",f);print(a[i])>f}}}" "e:\ZD\01\000001\000001_1.txt" d:\HY\000001\000001_1.txt
复制代码

TOP

本帖最后由 hfxiang 于 2023-3-11 10:22 编辑

如果工作文件夹 "d:\Data\01\"及"d:\Data\02\"中无其它无关的.txt文件,为避免terse大神7楼代码第3行的总长度有可能大于8192字节造成出错(主要是因为%f%的长度不过预知,有可能会造成过长),可把代码再简化如下(整个脚本只有1行):
  1. @gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND]=a[ARGIND]==\"\"?$2:a[ARGIND] \"\n\" $2;next}}{b[$0]++}END{for(i=2;i<=ARGIND;i++){ if(a[i]){f=ARGV[i];sub(/^d:/,\"e:\",f);print(a[i])>f}}}" "e:\Data\XXX.txt" d:\Data\01\*.txt d:\Data\02\*.txt
复制代码
1

评分人数

TOP

回复 6# 思想之翼
把赋值txt放后面处理 然后加个判断
根据你的示例 简化一下代码 不用DIR的话 就手动加一下处理的文件  "e:\Data\XXX.txt"文件放第一个处理
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (01 02) do for /f "tokens=*" %%b in ('dir /s/a-d /b "d:\Data\%%a\001_?.txt"') do set f=!f! "%%b"
  3. gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND]=a[ARGIND]==\"\"?$2:a[ARGIND] \"\n\" $2;next}}{b[$0]++}END{for(i=2;i<=ARGIND;i++){ if(a[i]){f=ARGV[i];sub(/^d:/,\"e:\",f);print(a[i])>f}}}"  "e:\Data\XXX.txt" %f%
  4. pause
复制代码
1

评分人数

TOP

回复 5# terse

感谢!确实未全部赋值,bwfr 也是这样。如何解决该问题?

TOP

回复 2# 思想之翼

看了问题已解决,来问一下,这样写好像没有确保这个XXX文件里的全部赋值了哦

TOP

  1. @echo off
  2. for %%a in (1 2) do (
  3. for /l %%b in (1,1,7) do (
  4. start /min "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\0%%a\001_%%b.txt e:\Data\XXX.txt>>e:\Data\0%%a\001_%%b.txt
  5. )
  6. )
  7. pause
复制代码

可以用for语句写到一起
1

评分人数

bat小白,请多指教!谢谢!

TOP

  1. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_1.txt e:\Data\XXX.txt>>e:\Data\01\001_1.txt
  2. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_2.txt e:\Data\XXX.txt>>e:\Data\01\001_2.txt
  3. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_3.txt e:\Data\XXX.txt>>e:\Data\01\001_3.txt
  4. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_4.txt e:\Data\XXX.txt>>e:\Data\01\001_4.txt
  5. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_5.txt e:\Data\XXX.txt>>e:\Data\01\001_5.txt
  6. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_6.txt e:\Data\XXX.txt>>e:\Data\01\001_6.txt
  7. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_7.txt e:\Data\XXX.txt>>e:\Data\01\001_7.txt
  8. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_1.txt e:\Data\XXX.txt>>e:\Data\02\001_1.txt
  9. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_2.txt e:\Data\XXX.txt>>e:\Data\02\001_2.txt
  10. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_3.txt e:\Data\XXX.txt>>e:\Data\02\001_3.txt
  11. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_4.txt e:\Data\XXX.txt>>e:\Data\02\001_4.txt
  12. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_5.txt e:\Data\XXX.txt>>e:\Data\02\001_5.txt
  13. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_6.txt e:\Data\XXX.txt>>e:\Data\02\001_6.txt
  14. start "" D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_7.txt e:\Data\XXX.txt>>e:\Data\02\001_7.txt
  15. ping 127.0.0.1 -n 10
  16. t
复制代码
start可以不等令命令结束就继续下一行命令
加ping的目的是等待所有gawk.exe执行完毕,如果你不需要等待可以删除之
1

评分人数


QQ 20147578

TOP

【已解决】如何将多行命令合成一组,提高运行效率

本帖最后由 思想之翼 于 2023-3-6 17:41 编辑

如何将下列逐行运行的代码,合成一组,让系统一次性对多条指令进行同时预处理,提高运行效率。
  1. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_1.txt e:\Data\XXX.txt>>e:\Data\01\001_1.txt
  2. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_2.txt e:\Data\XXX.txt>>e:\Data\01\001_2.txt
  3. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_3.txt e:\Data\XXX.txt>>e:\Data\01\001_3.txt
  4. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_4.txt e:\Data\XXX.txt>>e:\Data\01\001_4.txt
  5. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_5.txt e:\Data\XXX.txt>>e:\Data\01\001_5.txt
  6. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_6.txt e:\Data\XXX.txt>>e:\Data\01\001_6.txt
  7. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\01\001_7.txt e:\Data\XXX.txt>>e:\Data\01\001_7.txt
  8. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_1.txt e:\Data\XXX.txt>>e:\Data\02\001_1.txt
  9. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_2.txt e:\Data\XXX.txt>>e:\Data\02\001_2.txt
  10. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_3.txt e:\Data\XXX.txt>>e:\Data\02\001_3.txt
  11. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_4.txt e:\Data\XXX.txt>>e:\Data\02\001_4.txt
  12. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_5.txt e:\Data\XXX.txt>>e:\Data\02\001_5.txt
  13. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_6.txt e:\Data\XXX.txt>>e:\Data\02\001_6.txt
  14. D:\Tool\gawk.exe -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" d:\Data\02\001_7.txt e:\Data\XXX.txt>>e:\Data\02\001_7.txt
复制代码

TOP

返回列表