나는 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' 앞에 옵니다.