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로 돌아갑니다.

Ş를 사용하는 다른 언어와 로케일이 있다는 것을 알고 있지만 그 중 하나를 선택해야 답변을 작성할 수 있습니다. 귀하의 상황은 다를 수 있습니다.

답변2

어떻습니까:
cat file.txt 아이콘 |

iconv가 지정되지 않았으며 'sort' 또는 'uniq' 앞에 옵니다.

관련 정보