【问题标题】:awk remove non ascii charactersawk 删除非 ascii 字符
【发布时间】:2020-05-21 00:59:20
【问题描述】:

我正在尝试从大型文本文件中删除非 ascii 字符。我搜索了一下,发现了以下 tr 命令,它运行良好。但是,我希望使用 awk,因为此命令将进入我现有的 awk 脚本。 非常感谢任何帮助!

tr -cd '\11\12\15\40-\176' < InputFile > OutputFile

【问题讨论】:

  • 这不仅会删除非 ASCII 字符,还会删除一些 ASCII 字符。特别是它会删除 ASCII 字符 \00-\10、\13、\14、\16-\39 和 \177。我觉得您的目标并不是真正删除非 ASCII 字符,而是删除其他内容,并且可能已经存在 POSIX 字符类(或此类字符的组合)。也许您想删除[:cntrl:] 字符类中的所有字符?如果您告诉我们您真正想要做什么,并提供 minimal reproducible example 简洁、可测试的示例输入和预期输出,那么我们可以提供帮助。
  • 谢谢埃德。任务是清理一些文本文件,并上传到 AWS 云。然后使用 S3 选择查询来搜索数据。现在,AWS Select 的问题在于,一旦它在文件中看到非 UTF8 字符,它就会抛出错误……我的文本文件有很多垃圾。无论如何,如果有一个非 UTF8 字符,那么很可能我不需要它。因此,我可以在上传到 AWS 之前摆脱它
  • UTF8 编码使用 8 位,因此可以存储 256 个字符。 ASCII 字符使用 7 位(因此有 128 个),因此它们可以存储为 UTF8 并为另外 128 个字符留出空间(例如,用于编码带有重音的字符)。您的脚本正在删除除 ASCII 字符子集之外的所有字符。您无法可靠地测试给定文件以查看它是 UTF8 编码还是 UTF16 或其他(file 会猜测),并且您无法判断文件中的给定字节序列是 UTF8 编码的 x 还是 some -other-encoded y(其中 x 和 y 是一些字符)。所以,我想知道你怎么能按照你说的去做。
  • 查看unix.stackexchange.com/q/11602/133219stackoverflow.com/q/19212306/1745001,了解有关 Unicode 编码以及 ASCII 如何适应它们的更多信息。

标签: awk tr


【解决方案1】:

尝试 gsub 在括号表达式中使用相同的八进制转义:

gsub(/[^\11\12\15\40-\176]/,"")

【讨论】:

  • 感谢用户。但由于某种原因,这段代码仍然不是万无一失的。当我测试它时,它会遗漏一些特殊字符。这个命令是我更大的 awk 脚本的一部分。因此,即使是一个非 ascii 字符也会杀死脚本的其余部分.. 提到的“tr -cd”仍然可以正常工作。有没有办法改变 gsub 代码,也许扩展一下,使其全面
【解决方案2】:

the gawk manual 匹配ASCII 或非ASCII 字符,你可以使用一个范围:

您可以使用[\x00-\x7F] 模拟这样的构造。这匹配 0 到 127 之间的所有数值,这是定义的 ASCII 字符集的范围。使用补充字符列表 ([^\x00-\x7F]) 匹配任何不在其中的单字节字符 ASCII 范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多