web-dev-qa-db-ja.com

ファイルで使用されるすべての文字をリストする実用的な方法は何ですか(Bash)(Regex)

どうすればこれを変えることができます:

Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.

これに:

 abcdefghiklnoprstuwFJT',():.

(これらは入力に使用される合計文字です)

小文字の文字「jmqvz」は入力文に含まれていないため、出力されないことに注意してください。

順序はまったく重要ではありませんが、小文字、大文字、特殊文字の順に優先されます。

Sed/awk/etcが必要になると確信しています。このため、しかし、私は大規模な検索の後に類似したものを見つけていません。

3
TuxForLife

sedsortの組み合わせを使用できます。

$ 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:]]'は、可視文字を除くすべてを削除します。
11
muru

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
8
Nykakin

ああ、楽しい!いくつかの方法があります。最も単純な(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
3
terdon

入力文字列から重複する文字を削除するだけです。 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
2
Avinash Raj