uniq -i 不忽略非 Ascii 字符中的大小写

uniq -i 不忽略非 Ascii 字符中的大小写

我有一个txt:a.txt

A
a
B
b
Ş
ş

我尝试这个命令,但得到错误的输出:

$ uniq -ic a.txt 
      2     A
      2     B
      1     Ş
      1     ş

如何用uniq解决非ascii字符问题?

这是我的完整代码:

function show_authors() {
    id=0;
sqlite3 $db_file "SELECT author FROM books;" > /tmp/.list.txt
sort /tmp/.list.txt | uniq -ic > /tmp/.listed.txt
while IFS=" " read -r count author
do
cat <<EOT
<a href="#$id">$author</a> ($count), 
EOT
id=$(($id + 1))
done < /tmp/.listed.txt
}

cat <<EOT
<div id="author">
$(show_authors)
</div>
EOT

我的代码在 shell 中可以正常工作,但在 CGI-Bash 子 shell 中不能正确工作。

答案1

您可能需要更改区域设置(如果尚未更改),至少对于该命令是这样。对于 en_US 语言环境,Ş 和 ş 不相关。

LC_ALL=tr_TR 将引入一个语言环境,其中 Ş 是 ş 的大写,并且将被正确考虑。

但如果您使用 UTF-8,该命令可能仍然不起作用。为了让它工作,你需要返回到 uniq 可以处理的单字节编码,然后返回到 UTF-8:

所以,如果这不起作用:

$ LC_ALL=tr_TR uniq -ic a.txt

你可以试试:

$ LC_ALL=tr_TR iconv -f UTF-8 -t ISO-8859-3 < a.txt | tr '[:upper:]' '[:lower:]' | uniq -c | iconv -f ISO-8859-3 -t UTF-8

命令行从 UTF-8(多字节)变为 ISO-8859-3(单字节),然后将所有内容更改为大写,调用 uniq,然后返回到 UTF-8。

我知道还有其他语言和区域设置使用 Ş,但我必须选择其中一种来写答案。你的可能会有所不同。

答案2

怎么样:
cat file.txt |图标|优衣库-i

未指定 iconv 且位于“sort”或“uniq”之前

相关内容