Awk

使用 awk 在 txt 文件中按 unicode 搜尋

  • August 16, 2022

我如何使用 awk 通過 unicode 搜尋 txt 文件,例如:

u+064C

u+064D

並請我如何計算結果並在第一行列印數字。

如果使用zsh¹,您可以執行以下操作:

SEARCH=$'\u64c' awk 'index($0, ENVIRON["SEARCH"])'

列印包含該字元的行。對於 U+FFFF 以上的字元,使用$'\U1F427'(例如🐧),\u限制為 4 位,\U到 8 位。

要計算這些行:

SEARCH=$'\u64c' awk 'index($0, ENVIRON["SEARCH"]) {n++}
                    END {print n+0}'

$'\u64c將擴展為 U+064C 字元的編碼是使用者的語言環境,例如 0xec 在ar_TN.iso88596其中charmap 為 ISO-8859-6 或 0xd9 0x8c 在 en_US.UTF-8 中為 UTF-8 或 0x81 0x31 0x87 0x36 在zh_CN.gb18030哪裡是 GB18030。

如果區域設置的字元集沒有該字元,則該命令會因*zsh: character not in range*錯誤而中止。

對於某些 awk 實現和在某些系統上(其中 wchar_t 映射到 Unicode 程式碼點)以及在字元映射為多字節的語言環境中(例如上面的 UTF-8 或 GB18030),sprintf("%c", 0x64c)返回 U+064C 字元的編碼。awk至少 GNU 系統上的 GNU 就是這種情況。在這些情況下,您可以使用:

awk 'BEGIN{search = sprintf("%c", 0x64c)}
    index($0, search)'

在不存在 U+064C 字元的多字節語言環境中,我發現gawk’ssprintf("%c", 0x64c)返回 0x4c 字節而不是 (0x64c % 0x100) (在單字節語言環境中相同,無論語言環境的字元集中是否存在 U+064C)。


¹ 其他一些 shell 此後也增加了對的支持$'\uXXXX',但是當涉及到字元編碼在哪個字元集以及字元集沒有字元時會發生什麼時,行為會有所不同。

引用自:https://unix.stackexchange.com/questions/713758