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プロセス中に複数のマルチギガビットファイルを処理する必要があるときです。 200個を超えるファイルを含む10個のフォルダ内の各ファイルの処理に往復するのに100秒かかると計算すると、変換時間がかなり早く増えます!
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}'
つまり、入力はバイトストリームとして扱われますが、レコードとフィールドの区切り文字を2バイトの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)を含めることはできません|
(改行または移植可能な文字セット内のすべての文字に対して同じ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