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

私のコードはシェルでは正しく動作しますが、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」の前にあります。

関連情報