私は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
私のコードはシェルでは正しく動作しますが、CGI-Bashサブシェルでは動作しません。
答え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に戻ります。
Şを使用する他の言語とロケールがあることはわかっていますが、そのうちの1つを選択するだけで答えを書くことができます。あなたの状況は異なる場合があります。
答え2
どうですか:
cat file.txtアイコン|
iconvは指定されておらず、「sort」または「uniq」の前にあります。