本帖最后由 思想之翼 于 2026-5-7 14:41 编辑
先运行代码1,依靠代码1生成的文件,再运行代码2,能够正常运行。将代码1+代码2合并,闪退。可能是延迟变量的问题,请帮助修改。
- :: ================= 代码1 =================
- @echo off
- setlocal enabledelayedexpansion
- for /l %%d in (10000,1,10000) do (
- set o=%%d
- for /l %%e in (100009,1,100009) do (
- set p=%%e
- "Z:\KZ\001\gawk.exe" -F"=" "NR==FNR{B[i++]=$0;next}{A[$1]=$2}END{for(i=0;i<length(B);i++){print A[B[i]]}}" "Z:\QWS\数据\!o:~1!\1234_01_2.txt" "Z:\SJKZ原版\!p:~1!.txt" | "Z:\KZ\001\gawk.exe" "NR%%8==1{close(\"Z:/KZ/001/\"n\"A.txt\");++n}{print>\"Z:/KZ/001/\"n\"A.txt\"}"
- "Z:\KZ\001\gawk.exe" -f "Z:\KZ\001\replace_001.gawk"
- del /q "Z:\KZ\001\*A.txt">nul 2>&1
- for /l %%f in (1001,1,1500) do (
- set q=%%f
- "Z:\KZ\001\gawk.exe" -v "N=1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25&26&27&28&29&30&31&32" -v "RS=\r?\n| " -v "ORS= " -f "Z:\KZ\001\词频_001.gawk" "Z:\KZ\001\A\!q:~1!.txt"
- )
- )
- )
- endlocal
- :: ================= 代码1 结束=================
- :: ================= 代码2 =================
- @echo off
- setlocal enabledelayedexpansion
- :: 1. 生成 seq.txt
- (for /l %%i in (0,1,9999) do (
- set "num=0000%%i"
- echo !num:~-4!
- )) > "Z:\KZ\001\seq.txt"
- :: 2. 动态计算最小小组数
- echo 正在计算最小小组数...
- set MIN_GROUP=999999
- for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
- Z:\KZ\001\gawk.exe "{print int((NF-1)/5000)}" "Z:/KZ/001/%%fM.txt" > "Z:\KZ\001\tmp_cnt.txt"
- set /p cnt=<"Z:\KZ\001\tmp_cnt.txt"
- echo %%f: !cnt!
- if !cnt! lss !MIN_GROUP! set MIN_GROUP=!cnt!
- )
- del "Z:\KZ\001\tmp_cnt.txt"
- echo 最小小组数: %MIN_GROUP%
- :: 3. 处理每个小组
- if %MIN_GROUP% leq 0 (
- echo 错误:最小小组数为0,请检查数据。
- pause
- exit /b
- )
- echo 处理小组1~%MIN_GROUP%...
- for /l %%g in (1,1,%MIN_GROUP%) do (
- echo 小组 %%g
- set /a "start=(%%g-1)*5000+1"
- set /a "end=%%g*5000"
- set "outfile=Z:\KZ\001\0000%%g.txt"
- type nul > "!outfile!"
- for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
- Z:\KZ\001\gawk.exe -v s=!start! -v e=!end! "{n=split($0,a,\" \"); if(e<=n){for(i=s;i<=e;i++) printf a[i] (i==e?\"\":\" \")}}" "Z:/KZ/001/%%fM.txt" | Z:\KZ\001\gawk.exe "{split($0,a,\" \"); for(i in a) c[a[i]]++; while((getline s<\"Z:/KZ/001/seq.txt\")>0) c[s]++; for(i in c) if(c[i]==2) print i}" >> "!outfile!"
- )
- )
- :: 4. 求交集
- echo 计算交集...
- Z:\KZ\001\gawk.exe "FNR==1{No++}{for(i=0;i++<NF;)a[No][$i]=1}END{for(i in a)for(j in a[i])if(++d[j]==No)print j}" "Z:/KZ/001/0000*.txt" > "Z:/KZ/001/交集结果.txt"
- :: 5. 显示结果
- echo 交集结果已保存至 Z:\KZ\001\交集结果.txt
- find /c /v "" "Z:\KZ\001\交集结果.txt"
- del "Z:\KZ\001\seq.txt" 2>nul
- pause
- :: ================= 代码2 结束=================
- ::=================【问题:代码2 插入代码1(运行闪退)】=================
- @echo off
- setlocal enabledelayedexpansion
- for /l %%d in (10000,1,10000) do (
- set o=%%d
- for /l %%e in (100009,1,100009) do (
- set p=%%e
- :: ================= 代码1 =================
- "Z:\KZ\001\gawk.exe" -F"=" "NR==FNR{B[i++]=$0;next}{A[$1]=$2}END{for(i=0;i<length(B);i++){print A[B[i]]}}" "Z:\QWS\数据\!o:~1!\1234_01_2.txt" "Z:\SJKZ原版\!p:~1!.txt" | "Z:\KZ\001\gawk.exe" "NR%%8==1{close(\"Z:/KZ/001/\"n\"A.txt\");++n}{print>\"Z:/KZ/001/\"n\"A.txt\"}"
- "Z:\KZ\001\gawk.exe" -f "Z:\KZ\001\replace_001.gawk"
- del /q "Z:\KZ\001\*A.txt">nul 2>&1
- for /l %%f in (1001,1,1500) do (
- set q=%%f
- "Z:\KZ\001\gawk.exe" -v "N=1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25&26&27&28&29&30&31&32" -v "RS=\r?\n| " -v "ORS= " -f "Z:\KZ\001\词频_001.gawk" "Z:\KZ\001\A\!q:~1!.txt"
- )
- :: ================= 代码1 结束=================
- :: ================= 代码2=================
- :: 1. 生成 seq.txt
- (for /l %%i in (0,1,9999) do (
- set "num=0000%%i"
- echo !num:~-4!
- )) > "Z:\KZ\001\seq.txt"
- :: 2. 动态计算最小小组数
- echo 正在计算最小小组数...
- set MIN_GROUP=999999
- for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
- Z:\KZ\001\gawk.exe "{print int((NF-1)/5000)}" "Z:/KZ/001/%%fM.txt" > "Z:\KZ\001\tmp_cnt.txt"
- set /p cnt=<"Z:\KZ\001\tmp_cnt.txt"
- echo %%f: !cnt!
- if !cnt! lss !MIN_GROUP! set MIN_GROUP=!cnt!
- )
- del "Z:\KZ\001\tmp_cnt.txt"
- echo 最小小组数: !MIN_GROUP!
- :: 3. 处理每个小组
- if !MIN_GROUP! leq 0 (
- echo 错误:最小小组数为0,请检查数据。
- pause
- exit /b
- )
- echo 处理小组1~!MIN_GROUP!...
- for /l %%g in (1,1,!MIN_GROUP!) do (
- echo 小组 %%g
- set /a "start=(%%g-1)*5000+1"
- set /a "end=%%g*5000"
- set "outfile=Z:\KZ\001\0000%%g.txt"
- type nul > "!outfile!"
- for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
- Z:\KZ\001\gawk.exe -v s=!start! -v e=!end! "{n=split($0,a,\" \"); if(e<=n){for(i=s;i<=e;i++) printf a[i] (i==e?\"\":\" \")}}" "Z:/KZ/001/%%fM.txt" | Z:\KZ\001\gawk.exe "{split($0,a,\" \"); for(i in a) c[a[i]]++; while((getline s<\"Z:/KZ/001/seq.txt\")>0) c[s]++; for(i in c) if(c[i]==2) print i}" >> "!outfile!"
- )
- )
- :: 4. 求交集
- echo 计算交集...
- Z:\KZ\001\gawk.exe "FNR==1{No++}{for(i=0;i++<NF;)a[No][$i]=1}END{for(i in a)for(j in a[i])if(++d[j]==No)print j}" "Z:/KZ/001/0000*.txt" > "Z:/KZ/001/交集结果.txt"
- :: 5. 显示结果
- echo 交集结果已保存至 Z:\KZ\001\交集结果.txt
- find /c /v "" "Z:\KZ\001\交集结果.txt"
- del "Z:\KZ\001\seq.txt" 2>nul
- :: ================= 代码2 结束=================
- )
- )
- endlocal
复制代码
已解决
- @echo off
- setlocal enabledelayedexpansion
- for /l %%d in (10000,1,10000) do (
- set o=%%d
- for /l %%e in (100011,1,100011) do (
- set p=%%e
- rem ================= 代码1 =================
- "Z:\KZ\001\gawk.exe" -F"=" "NR==FNR{B[i++]=$0;next}{A[$1]=$2}END{for(i=0;i<length(B);i++){print A[B[i]]}}" "Z:\QWS\数据\!o:~1!\1234_01_2.txt" "Z:\SJKZ原版\!p:~1!.txt" | "Z:\KZ\001\gawk.exe" "NR%%8==1{close(\"Z:/KZ/001/\"n\"A.txt\");++n}{print>\"Z:/KZ/001/\"n\"A.txt\"}"
- "Z:\KZ\001\gawk.exe" -f "Z:\KZ\001\replace_001.gawk"
- del /q "Z:\KZ\001\*A.txt">nul 2>&1
- for /l %%f in (1001,1,1500) do (
- set q=%%f
- "Z:\KZ\001\gawk.exe" -v "N=1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25&26&27&28&29&30&31&32" -v "RS=\r?\n| " -v "ORS= " -f "Z:\KZ\001\词频_001.gawk" "Z:\KZ\001\A\!q:~1!.txt"
- )
- rem ================= 代码1结束 =================
- rem ================= 代码2 =================
- rem 使用 setlocal 隔离代码2的局部变量,避免污染外层
- setlocal enabledelayedexpansion
- rem 1. 生成 seq.txt
- (for /l %%i in (0,1,9999) do (
- set "num=0000%%i"
- echo !num:~-4!
- )) > "Z:\KZ\001\seq.txt"
- rem 2. 动态计算最小小组数
- echo 正在计算最小小组数...
- set MIN_GROUP=999999
- for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
- Z:\KZ\001\gawk.exe "{print int((NF-1)/5000)}" "Z:/KZ/001/%%fM.txt" > "Z:\KZ\001\tmp_cnt.txt"
- set /p cnt=<"Z:\KZ\001\tmp_cnt.txt"
- echo %%f: !cnt!
- if !cnt! lss !MIN_GROUP! set MIN_GROUP=!cnt!
- )
- del "Z:\KZ\001\tmp_cnt.txt"
- echo 最小小组数: !MIN_GROUP!
- if !MIN_GROUP! leq 0 (
- echo 错误:最小小组数为0,请检查数据。
- pause
- exit /b
- )
- rem 3. 处理每个小组(注意边界必须用延迟变量)
- echo 处理小组1~!MIN_GROUP!...
- for /l %%g in (1,1,!MIN_GROUP!) do (
- echo 小组 %%g
- set /a "start=(%%g-1)*5000+1"
- set /a "end=%%g*5000"
- rem 文件名补零到4位:0001.txt 等,%%g 取位
- set "gnum=0000%%g"
- set "outfile=Z:\KZ\001\!gnum:~-4!.txt"
- type nul > "!outfile!"
- for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
- Z:\KZ\001\gawk.exe -v s=!start! -v e=!end! "{n=split($0,a,\" \"); if(e<=n){for(i=s;i<=e;i++) printf a[i] (i==e?\"\":\" \")}}" "Z:/KZ/001/%%fM.txt" | Z:\KZ\001\gawk.exe "{split($0,a,\" \"); for(i in a) c[a[i]]++; while((getline s<\"Z:/KZ/001/seq.txt\")>0) c[s]++; for(i in c) if(c[i]==2) print i}" >> "!outfile!"
- )
- )
- rem 4. 求交集
- echo 计算交集...
- Z:\KZ\001\gawk.exe "FNR==1{No++}{for(i=0;i++<NF;)a[No][$i]=1}END{for(i in a)for(j in a[i])if(++d[j]==No)print j}" "Z:/KZ/001/00*.txt" > "Z:/KZ/001/交集结果.txt"
- rem 5. 显示结果
- echo 交集结果已保存至 Z:\KZ\001\交集结果.txt
- find /c /v "" "Z:\KZ\001\交集结果.txt"
- del "Z:\KZ\001\seq.txt" 2>nul
- endlocal
- rem ================= 代码2结束 =================
- )
- )
- endlocal
- pause
复制代码 |