Как я могу превратить это:
Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.
К этому:
abcdefghiklnoprstuwFJT',():.
(Это общее количество символов, используемых на входе)
Обратите внимание, что символы маленького регистра "jmqvz" не были во входном предложении, поэтому не выводились.
Порядок не важен вообще, но предпочтительнее будет нижний регистр, затем верхний регистр, а затем специальные символы.
Я уверен, что мне понадобится sed / awk / etc. для этого, но я не нашел ничего подобного после продолжительных поисков.
Можно использовать комбинацию sed
и sort
:
$ echo "Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef." |
> sed 's/./&\n/g' | LC_COLLATE=C sort -u | tr -d '\n'
'(),.:FJTabcdefghiklnoprstuwxy
sort
делает лексикографическую сортировку, поэтому см. man 7 ascii
, чтобы видеть, как символы закажут.
Объяснение:
sed 's/./&\n/g'
- добавляют новую строку после каждого символа, так как sort
(обычно) делает линию за линией сортировку LC_COLLATE=C
наборы стиль сопоставления к C
(см. , Что делает “LC_ALL=C”, делают? ) sort -u
: сортирует вход и печатает только уникальные записи tr -d '\n'
, удаляет все дополнительные новые строки. , Если Вы хотите сохранить только видимые символы:
$ echo "Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef." |
> tr -cd '[[:graph:]]' | sed 's/./&\n/g' | LC_COLLATE=C sort -u | tr -d '\n'
tr -cd '[[:graph:]]'
удаляет все кроме видимых символов. Можно распечатать каждый символ файла в отдельной строке с помощью fold -w1
, затем отсортировать вывод и устранить дубликаты с sort -u
(или sort | uniq
):
$ cat test
Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.
$ fold -w1 test | sort -u
,
:
.
'
(
)
a
b
c
d
e
f
F
g
h
i
J
k
l
n
o
p
r
s
t
T
u
w
x
y
Тогда можно превратить это в одну строку снова, например, с paste -sd "" -
:
$ fold -w1 test | sort -u | paste -sd "" -
,:.'()abcdefFghiJklnoprstTuwxy
Ох, забава! Вот несколько путей. Самое простое (fold
) был уже дан, но здесь способ развернуть это для предоставления счетов для каждого символа также:
$ fold -w 1 file | LC_ALL=C sort | uniq -c
11
2 "
1 '
1 (
1 )
3 ,
1 .
1 :
1 F
1 J
1 T
1 a
1 b
2 c
2 d
9 e
4 f
2 g
4 h
5 i
1 k
3 l
7 n
6 o
1 p
2 r
4 s
1 t
2 u
1 w
1 x
1 y
Использование LC_ALL=C
устанавливает локаль на C для sort
команда, что означает, что ПРОПИСНЫЕ БУКВЫ отсортированы перед нижними регистрами, поскольку Вы запросили. Для получения всего этого на той же строке, не считая случаи, но с тем же порядком сортировки, Вы могли сделать
$ echo $(fold -w 1 file | LC_ALL=C sort -u | tr -d '\n')
"'(),.:FJTabcdefghiklnoprstuwxy
Вы могли также использовать Perl:
$ perl -lne '$k{$_}++ for split(//); END{print sort keys(%k)}' file
"'(),.:FJTabcdefghiklnoprstuwxy
Наконец, вот путь, который также показывает специальные символы как вкладки, новые строки и возвраты каретки:
$ echo $(od -c file | grep -oP "^\d+ +\K.*" | tr -s ' ' '\n' |
LC_ALL=C sort -u | tr -d '\n')
"'(),.:FJT\n\r\tabcdefghiklnoprstuwxy
------
|-------------> special characters
Просто удалите дублирующиеся символы из входной строки. set
функция в Python создала бы ряд объектов без любых дубликатов. т.е., set('ssss')
даст Вам сингл s
.
Через python3
$ cat file
Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.
$ python3 -c 'import sys
with open(sys.argv[1]) as f:
for line in f:
print("".join(sorted(set(line))))' file
'(),.:FJTabcdefghiklnoprstuwxy
Если Вы хотите удалить дублирующиеся символы, существующие в целом файле затем, Вы могли бы попробовать это.
$ python3 -c 'import sys
with open(sys.argv[1]) as f:
print("".join(sorted(set(f.read()))))' file