Centos7:awk支持utf16le吗?

Centos7:awk支持utf16le吗?

我知道 awk 可以处理 utf8,但是,这需要使用 iconv 进行双工转换步骤

说这样的话:

 iconv -f UTF-16 -t UTF-8 "$file" > "$fileTmp"
 #Perform operation 
 awk -F\| {print $1} $fileTmp > $awkFile
 iconv -f UTF-8 -t UTF-16 "$awkFile" > "$file"

我的问题是当我需要处理 ETL 过程中的多个多千兆文件时。计算出需要 100 秒才能处理 10 个包含 200 多个文件的文件夹中每个文件的往返,转换加起来非常快!

是否有可以本地处理 UTF16LE 的 AWK 版本或扩展版本?

答案1

您不能在 POSIX 系统上使用使用 UTF-16 的语言环境,因为它与 C 语言环境不兼容。

使用 GNU awk,您也许能够做到:

LC_ALL=C awk -v RS='\n\0' -v ORS='\n\0' -F '[|]\0' '{print $1}'

也就是说,将输入视为字节流,但将记录和字段分隔符设置为其两个字节 UTF-16LE 编码。

现在,如果输入包含以下内容,则无法正常工作:

<U+0AFF><U+FF00>

它将被编码为FF0A00FF(因此包含\n\0记录分隔符)。

转换为 UTF-8 似乎是唯一可靠的选择。不过,您不需要使用临时文件(此处假设语言环境的字符映射是 UTF-8)

< file.in iconv -f UTF-16LE |
  awk -F'|' '{print $1}' |
  iconv -t UTF-16LE > file.out

由于除了 UTF-8 之外,没有其他字符|可以包含 (0x7c) 的字节|(换行符或可移植字符集中的任何字符相同),因此您还可以通过使用 C 语言环境 for 进行优化,awk甚至使用cut

< file.in iconv -f UTF-16LE -t UTF-8 |
  LC_ALL=C cut -d '|' -f1 |
  iconv -f UTF-8 -t UTF-16LE > file.out

相关内容