どうすればこれを変えることができます:
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 "" -
を使用して、それを再び1行に変換できます。
$ 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
を使用すると、sort
コマンドのロケールがCに設定されます。つまり、CAPITALSは、要求した小文字の前にソートされます。オカレンスをカウントせずに、同じソート順序で同じ行にすべてを取得するには、次のようにします。
$ 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
入力文字列から重複する文字を削除するだけです。 pythonのset
関数は、重複のないアイテムのセットを作成します。すなわち、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