我有一个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”之前