Версия сценария оболочки BASH (без sed / awk):
while read -n 1 char; do echo "$char"; done < entry.txt | tr [A-Z] [a-z] | sort -u
ОБНОВЛЕНИЕ : Просто черт возьми, так как мне было скучно и я все еще думаю об этой проблеме, вот версия C ++ с использованием set. Если важно время выполнения, это будет мой рекомендуемый вариант, поскольку версия C ++ занимает чуть больше полсекунды для обработки файла с 450 000+ записей.
#include <iostream>
#include <set>
int main() {
std::set<char> seen_chars;
std::set<char>::const_iterator iter;
char ch;
/* ignore whitespace and case */
while ( std::cin.get(ch) ) {
if (! isspace(ch) ) {
seen_chars.insert(tolower(ch));
}
}
for( iter = seen_chars.begin(); iter != seen_chars.end(); ++iter ) {
std::cout << *iter << std::endl;
}
return 0;
}
Обратите внимание, что я игнорирую пробелы, и он не учитывает регистр в соответствии с запросом.
Для файла с 450 000+ записей (chars.txt) приведен пример времени выполнения:
[user@host]$ g++ -o unique_chars unique_chars.cpp
[user@host]$ time ./unique_chars < chars.txt
a
b
d
o
y
real 0m0.638s
user 0m0.612s
sys 0m0.017s