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

[其他] 【已解决】gawk:中间数据通过管道传递后出错,如何修改

[复制链接]
发表于 2025-3-18 21:10:29 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2025-3-19 02:18 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%d in (10000,1,10099) do (
  4.     set o=%%d
  5.     for /l %%e in (100000,1,100099) do (
  6.         set p=%%e

  7.         gawk -F"=" "NR==FNR{B[i++]=$0;next}{A[$1]=$2}END{for(i=0;i<length(B);i++){print A[B[i]]}}" "Z:\QWS\SJ\!o:~1!\1234_01.txt" "Z:\SJKZYB\!p:~1!.txt" > "Z:\KZ\001\DATA.txt"
  8.         gawk "NR%%10==1{close("Z:/KZ/001/"n"A.txt");++n}{print>"Z:/KZ/001/"n"A.txt"}" "Z:\KZ\001\DATA.txt"
  9.         del /q "Z:\KZ\001\DATA.txt" >nul 2>&1

  10.         for %%a in (1 2 3 4) do (
  11.             gawk -F"=" -v "tab=\t" "BEGIN{A["\t"]="\t"}NR==FNR{A[$1]=$2;next}{c=split($0,B,//);printf A[B[1]];t1=A[B[i]];for(i=2;i<=c;i++){((A[B[i]]~tab)||(t1~tab))?t=1:t=0;printf(t?"%%s":" %%s",A[B[i]]);t1=A[B[i]]};print ""}" "Z:\SJHY4\%%a.txt" "Z:\KZ\001\%%aA.txt" > "Z:\KZ\001\DATA2.txt"

  12.             gawk -F "\t+" "{for(i=1;i<=NF;++i)print $i>>"Z:/KZ/001/"i".txt"}" "Z:\KZ\001\DATA2.txt"
  13.             del /q "Z:\KZ\001\%%aA.txt" "Z:\KZ\001\DATA2.txt" >nul 2>&1
  14.         )
  15.     )
  16. )
  17. endlocal
复制代码
上列代码经过修改后,去除了DATA.txt和DATA2.txt的生成和删除步骤,通过管道传递数据,减少磁盘IO。
但是存在问题,双击XX.bat运行后,出现找不到Z:\KZ\001\1A.txt ... 的问题,如何解决?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%d in (10000,1,10000) do (
  4.     set o=%%d
  5.     for /l %%e in (100000,1,100000) do (
  6.         set p=%%e

  7.         "Z:\KZ\003\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\SJ\!o:~1!\1236_03.txt" "Z:\SJKZYB\!p:~1!.txt" | "Z:\KZ\003\gawk.exe" "NR%%10==1{close("Z:/KZ/003/"n"A.txt");++n}{print>"Z:/KZ/003/"n"A.txt"}"

  8.         for %%a in (1 2 3 4) do (
  9.             "Z:\KZ\003\gawk.exe" -F"=" -v "tab=\t" "BEGIN{A["\t"]="\t"}NR==FNR{A[$1]=$2;next}{c=split($0,B,//);printf A[B[1]];t1=A[B[1]];for(i=2;i<=c;i++){t=((A[B[i]]~tab)||(t1~tab))?1:0;printf(t?"%%s":" %%s",A[B[i]]);t1=A[B[i]]};print ""}" "Z:\SJHY4\%%a.txt" "Z:\KZ\003\%%aA.txt" | "Z:\KZ\003\gawk.exe" -F "\t+" "{for(i=1;i<=NF;i++)print $i>>"Z:/KZ/003/"i".txt"}"
  10.             del /q "Z:\KZ\003\%%aA.txt" >nul 2>&1
  11.         )
  12.     )
  13. )
  14. endlocal
复制代码
发表于 2025-3-18 23:49:19 | 显示全部楼层
反斜杠跟英文双引号放在一起时 ,英文双引号前面的反斜杠会被当成转义反斜杠的
\"Z:\\KZ\\001\\\"n\"A.txt\" ,带颜色的部分会被当成转义反斜杠和转义英文双引号 ,变成\" ,并不是\\" ,所以得写成\"Z:\\KZ\\001\\\\\"n\"A.txt\"
更多请参考http://www.bathome.net/thread-3451-1-1.html
 楼主| 发表于 2025-3-19 02:05:29 | 显示全部楼层
回复 2# Five66
已解决,谢谢指点!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%d in (10000,1,10099) do (
  4.     set o=%%d
  5.     for /l %%e in (100000,1,100099) do (
  6.         set p=%%e

  7.         "Z:\KZ\003\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\SJ\!o:~1!\1236_03.txt" "Z:\SJKZ原版\!p:~1!.txt" | "Z:\KZ\003\gawk.exe" "NR%%10==1{close("Z:/KZ/003/"n"A.txt");++n}{print>"Z:/KZ/003/"n"A.txt"}"

  8.         for %%a in (1 2 3 4) do (
  9.             "Z:\KZ\003\gawk.exe" -F"=" -v "tab=\t" "BEGIN{A["\t"]="\t"}NR==FNR{A[$1]=$2;next}{c=split($0,B,//);printf A[B[1]];t1=A[B[1]];for(i=2;i<=c;i++){t=((A[B[i]]~tab)||(t1~tab))?1:0;printf(t?"%%s":" %%s",A[B[i]]);t1=A[B[i]]};print ""}" "Z:\SJHY4\%%a.txt" "Z:\KZ\003\%%aA.txt" | "Z:\KZ\003\gawk.exe" -F "\t+" "{for(i=1;i<=NF;i++)print $i>>"Z:/KZ/003/"i".txt"}"
  10.             del /q "Z:\KZ\003\%%aA.txt" >nul 2>&1
  11.         )
  12.     )
  13. )
  14. endlocal
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:29 , Processed in 0.019182 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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