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

[文本处理] 【求助】求一个最新的单文件的gawk

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
本帖最后由 87zrjojo 于 2026-10-14 09:38 编辑

背景:我想自己编码一个码表对比脚本,因为网上下载的码表词库都比较大,一般几十万条,用excel处理起来非常卡顿费劲,发现用awk来处理2个码表的不同非常快,一般只需要1秒钟,但旧版的gawk好像不支持直接处理utf-8文件,新版本又用不了,所以想求一个能直接使用的单文件gawk。论坛大佬多,求分享一下!

在论坛找到的单文件的gawk只有GNU Awk 4.1.0这个版本可以在win7中正常使用,其它的新版本都不能用(报错),不知道是不是缺少什么依赖,也没看到相关配置方法。所以我想找一个不需要其它依赖的单文件gawk,不知道有没有这样的编译好的工具。


下面是我用deepseek帮我写的一个码表对比的awk脚本,目前测试可用,但我还想实现一个功能,就是将码表格式进行相互转换,比如将“词条 \t 编码 [\t 词频]”这样的词条,转换成“编码 词条 [词频]”以及“编码 词条1 词条2……”这样的格式(以及相互转换),不知道能不能用awk脚本实现,AI写出来的不对,顺便求大神帮忙添加一下功能。

compare.awk
  1. # ============================================================
  2. # 功能:比较 ck1.txt 与 ck2.txt 的"词条+编码"
  3. #   ck1.txt(待处理码表):词条 \t 编码 [\t 词频]
  4. #   ck2.txt(参照码表)   :词条 \t 编码 [\t 词频]
  5. # 输出:
  6. #   ck1_comm.txt —— ck1 中与 ck2 "词条+编码"一致的行
  7. #   ck1_diff.txt —— ck1 中与 ck2 "词条+编码"不一致的行
  8. #
  9. # 环境要求:gawk 4.1.0(Windows 版),运行时加 -b 参数
  10. # 为什么用 -b(--characters-as-bytes):
  11. #   gawk 4.1.0 在 Windows 上不能正确解析 UTF-8 多字节字符,
  12. #   会把一个汉字当成 3 个独立字节处理。加 -b 后 gawk 完全
  13. #   按字节流处理,不做任何字符集转换。
  14. #
  15. # 说明:
  16. #   1. awk 原样输出整行,因此 ck1.txt 若带词频会自动保留。
  17. #   2. 兼容 UTF-8 BOM 与 Windows CRLF 换行。
  18. #   3. 输出文件名由批处理通过 -v 传入,此处只负责逻辑。
  19. # ============================================================

  20. BEGIN {
  21.     FS = "\t"              # 输入字段分隔符:Tab
  22.     OFS = "\t"             # 输出字段分隔符:Tab
  23.     # 若批处理未传入输出文件名,则使用默认值,保证脚本可独立运行
  24.     if (commFile == "") commFile = "ck1_comm.txt"
  25.     if (diffFile == "") diffFile = "ck1_diff.txt"
  26. }

  27. # ---------- 第1个文件:ck2.txt(参照码表) ----------
  28. NR == FNR {
  29.     sub(/\r$/, "")                       # 去掉行尾 \r
  30.     # 去掉 UTF-8 BOM(仅第一行第一个字段可能出现)
  31.     # BOM 是 EF BB BF 三个字节,在 -b 模式下按字节匹配即可
  32.     if (FNR == 1) sub(/^\xEF\xBB\xBF/, "", $1)

  33.     key = $1 "\t" $2                     # 以"词条+编码"为唯一键
  34.     ref[key] = 1                         # 存入参照集合

  35.     next                                 # 读完 ck2 后跳过下面的处理块
  36. }

  37. # ---------- 第2个文件:ck1.txt(待处理码表) ----------
  38. {
  39.     sub(/\r$/, "")
  40.     if (FNR == 1) sub(/^\xEF\xBB\xBF/, "", $1)

  41.     key = $1 "\t" $2

  42.     if (key in ref) {
  43.         print $0 > commFile              # 一致 → 写入 comm 文件
  44.     } else {
  45.         print $0 > diffFile              # 不一致 → 写入 diff 文件
  46.     }
  47. }
复制代码


调用批处理compare.bat
  1. @echo off
  2. setlocal

  3. REM ============================================================
  4. REM 码表比较批处理(默认用 ck1.txt / ck2.txt)
  5. REM
  6. REM   默认文件名:
  7. REM     ck1.txt          待处理码表(码表1)
  8. REM     ck2.txt          参照码表(码表2)
  9. REM     ck1_comm.txt     输出:相同行
  10. REM     ck1_diff.txt     输出:不同行
  11. REM
  12. REM   环境要求:gawk 4.1.0(Windows 版)
  13. REM
  14. REM   关键:调用 gawk 时使用 -b 参数,按字节处理,
  15. REM         避免 gawk 4.1.0 在 Windows 上解析 UTF-8 出错。
  16. REM
  17. REM   注意:不设置 chcp 65001,保持 cmd 默认代码页,
  18. REM         避免 Win7 下 cmd 对 UTF-8 支持不佳的问题。
  19. REM
  20. REM   如需自定义文件名:直接修改下面 2 个 set 变量即可。
  21. REM   也可以运行时临时指定:
  22. REM   compare.bat 待处理码表.txt 参照对比码表.txt
  23. REM ============================================================

  24. REM ---------- gawk 路径 ----------
  25. REM 如果 gawk 不在 PATH 中或未在当前目录,请填写完整路径,例如:
  26. REM set AWK="C:\gawk-4.1.0\bin\gawk.exe"
  27. set AWK=gawk.exe

  28. REM ---------- 默认文件名(可自行修改) ----------
  29. set CK1=ck1.txt
  30. set CK2=ck2.txt

  31. REM ---------- 若运行时传入了参数,则覆盖默认值 ----------
  32. if not "%~1"=="" set CK1=%~1
  33. if not "%~2"=="" set CK2=%~2

  34. REM ---------- 自动生成输出文件名(基于 CK1 的主名) ----------
  35. for %%F in ("%CK1%") do set BASENAME=%%~nF
  36. set COMM=%BASENAME%_comm.txt
  37. set DIFF=%BASENAME%_diff.txt

  38. REM ---------- 检查输入文件是否存在 ----------
  39. if not exist "%CK1%" (
  40.     echo [ERROR] Input file not found: %CK1%
  41.     pause
  42.     exit /b 1
  43. )
  44. if not exist "%CK2%" (
  45.     echo [ERROR] Reference file not found: %CK2%
  46.     pause
  47.     exit /b 1
  48. )

  49. REM ---------- 删除旧结果,避免追加混淆 ----------
  50. if exist "%COMM%" del "%COMM%"
  51. if exist "%DIFF%" del "%DIFF%"

  52. REM ---------- 调用 gawk ----------
  53. REM   参数顺序很重要:先参照文件(ck2),再待处理文件(ck1)
  54. REM   -b        按字节处理,规避 gawk 4.1.0 的 UTF-8 解析问题
  55. REM   -v        把输出文件名传给 awk 脚本
  56. REM   -f        指定 awk 脚本文件
  57. %AWK% -b -v commFile="%COMM%" -v diffFile="%DIFF%" -f compare.awk "%CK2%" "%CK1%"

  58. echo.
  59. echo Done.
  60. echo   Same lines  : %COMM%
  61. echo   Diff lines  : %DIFF%
  62. echo.
  63. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-14 11:00

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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