多年来,我一直在努力让 AWK 在 Windows 下运行。引用和路径分隔符存在问题。我的最终解决方案是“让 AWK 自由飞行”,即从命令行中解放出来。我知道它是作为 unix 风格命令行 juju 的粘合剂而开发的,但我只是想将它用作脚本语言。
我所有的 AWK 脚本都包含一个目标列表和一个定义的输出文件。它们可以通过双击关联的 DOS 批处理文件来运行:
: AWK.BAT - place in the same directory as GAWK
@echo off
:Check %1 in not null
If [%1]==[] (
cls
Echo No parameters passed
goto End
)
: Change to the parameter file location
cd /D "%~dp1"
: Set PrintFile - this will be the name of the script (not the target file) with ".out"
Set PrintFile=%~nx1.out
:Run AWK
: -v PrintFile to allow renaming of output file
: -f ScriptFile.awk the program
: > Redirects output to a known destination
cls
P:\MyPrograms\EDITORS\Addins\gawk\gawk.exe -v PrintFile=%PrintFile% -f %* >%PrintFile%
:End
pause
下面给出了我的 AWK 脚本的一个示例(使用 ::tab 提取所有行并打印它们):
# AWK Template
BEGIN{
## Hard Code Target Files - Unix paths with / separators ##
# Realtive paths from the location of ScriptFileName.awk
# These will be added to the end of the ARG array - after any command line target files
AddTarget("../APEdit.ahk")
## Hard Code Output Files - WinDos paths with \\ separators ##
# Realtive paths from the location of ScriptFileName.awk
# Default is ScriptFileName.awk.out passed in as a variable called PrintFile
# PrintFile will be copied to OutputFile after processing using the END section
OutputFile = "Keys.txt"
# Set input record sep and field sep
RS="\n"
FS=" "
# Set output RS and FS
ORS="\n"
OFS=" "
# Write a header
print "Key assignments from the source code"
print " "
}
## MIDDLE - Once per matching record! ##
# Find autohotkey key definitions
/::\t/ {
print $0
}
END{
## Rename output files
if (OutputFile) {
system("Copy /Y " PrintFile " " OutputFile)
}
}
## Functions ##
function AddTarget(FN){
# Need to check file exists
if (FileExists(FN)){
ARGV[ARGC] = FN
ARGC ++
}
}
function FileExists(FN) {
if ((getline < FN) > 0) {
close(FN);
return 1
} else {
print "Target file not found " FN > "error.awk.txt"
return ""
}
}
您可以看到这定义了脚本中的输入目标并定义了脚本中的最终输出目标。它使用临时“.out”文件来避免大量打印重定向,将文件复制到脚本 END 部分中的所需输出。
我已将 AWK 文件与此批处理文件相关联,并在我的编辑器中添加了一个选项以将 AWK 文件发送到批处理文件。
亲切的问候