【发布时间】: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/133219 和stackoverflow.com/q/19212306/1745001,了解有关 Unicode 编码以及 ASCII 如何适应它们的更多信息。