Windows 为什么awk要打印看起来像中文的字符

Windows 为什么awk要打印看起来像中文的字符,windows,awk,Windows,Awk,在我使用AWK的这些年里,我从未遇到过这样的事情。 我试过呆呆和发牢骚 我已将我的awk脚本缩减为 { print } 应该只回应每一行。但是,每隔一行打印一次,就好像它在不同的代码页上一样 文件是通过从Access导出创建的,因此: Dim oApplication Set oApplication = CreateObject("Access.Application") oApplication.OpenAccessProject sFileName For Each

在我使用AWK的这些年里,我从未遇到过这样的事情。
我试过呆呆和发牢骚

我已将我的awk脚本缩减为

 { print }
应该只回应每一行。但是,每隔一行打印一次,就好像它在不同的代码页上一样

文件是通过从Access导出创建的,因此:

Dim oApplication
Set oApplication = CreateObject("Access.Application")
oApplication.OpenAccessProject sFileName
For Each myObj In oApplication.CurrentProject.AllForms
    WScript.Echo "Exporting FORM " & myObj.FullName
    oApplication.SaveAsText acForm, myObj.FullName, sExportpath & "\" & myObj.FullName & ".form"
    oApplication.DoCmd.Close acForm, myObj.FullName
    dctDelete.Add "FO" & myObj.FullName, acForm
Next
生成的源文件看起来像

Operation =1
Option =0
Begin InputTables
    Name ="Fee Types"
End
Begin OutputColumns
    Expression ="[Fee Types].ID"
    Expression ="[Fee Types].Type"
    Expression ="[Fee Types].Category"
End
输出看起来像

Operation =1
਍伀瀀琀椀漀渀 㴀 ഀഀ
Begin InputTables
਍    一愀洀攀 㴀∀䘀攀攀 吀礀瀀攀猀∀ഀഀ
End
਍䈀攀最椀渀 伀甀琀瀀甀琀䌀漀氀甀洀渀猀ഀഀ
    Expression ="[Fee Types].ID"
਍    䔀砀瀀爀攀猀猀椀漀渀 㴀∀嬀䘀攀攀 吀礀瀀攀猀崀⸀吀礀瀀攀∀ഀഀ
    Expression ="[Fee Types].Category"
਍䔀渀搀ഀഀ
਍
执行

 gawk.exe -f "FilterBinary.awk"  input.txt > output.txt

您好,我按照您的步骤操作,得到了相同的输出和输入:

Operation =1
Option =0
Begin InputTables
    Name ="Fee Types"
End
Begin OutputColumns
    Expression ="[Fee Types].ID"
    Expression ="[Fee Types].Type"
    Expression ="[Fee Types].Category"
End

这仍然是我见过的最奇怪的事情。
打印每个字符的序数值表明,每个可见字符和一对值分别为254和255的字符之间存在文本空值

不知道为什么这只会破坏其他线路。
但这确实解释了为什么我的匹配都不起作用


显然,解决方案是对其进行过滤,只打印Ord值为13或大于31但小于128的字符。

是否有可能存在两个名为FilterBinary.awk的文件?您运行的是CYGWIN bash shell还是Windows cmd shell?是否设置了shell变量AWKPATH?术语设置为什么?@KenJackson两个文件:不太可能,因为此脚本的更改会反映在输出中。Windows命令shell。未设置TERM和AWKPATH。
gawk.exe“{print}”input.txt
此命令避免读取程序文件,并将输出直接写入终端。值得一试,因为这太奇怪了。您也可以在这里尝试gawk.exe v3.1.6:我的灵力告诉我,该文件是用CRLF编码的UTF-16LE,但被保存到git repo中,并使用
text eol=CRLF
。文件已经损坏,您必须先清除它,然后才能处理它。这并不奇怪。这就是UTF-16LE编码。254和255是UTF-16LE BOM。也许正确的问题是,我如何让AWK读取并写出它?目前,如果不先过滤掉中间的空字节,AWK模式匹配将无法工作。请返回源代码,将文件另存为UTF8,而不是UTF16。@RaymondChen我更新了问题以包含文件的来源。我同意这可能是一个代码页问题,但我仍然对它为什么不打印所有相同的行感到困惑。为什么一半的行是ascii,一半是字符?文件已损坏。我找不到
Access.Application.SaveAsText
;最近的是。如果您能说服SaveAsText将它们保存为UTF-8甚至ASCII,这将解决问题。这个问题会影响其他每一行,因为有人在每一行终止符处注入一个0x0D字节,并且由于UTF-16LE使用字节对来表示字符,添加一个字节会使该对移位,添加第二个字节会使其移位。