我知道 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