Какой практический способ перечислить каждый символ, используемый в файле (Bash) (Regex)

Как я могу превратить это:

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

К этому:

 abcdefghiklnoprstuwFJT',():.

(Это общее количество символов, используемых на входе)

Обратите внимание, что символы маленького регистра "jmqvz" не были во входном предложении, поэтому не выводились.

Порядок не важен вообще, но предпочтительнее будет нижний регистр, затем верхний регистр, а затем специальные символы.

Я уверен, что мне понадобится sed / awk / etc. для этого, но я не нашел ничего подобного после продолжительных поисков.

3
задан 3 April 2015 в 18:09

4 ответа

Можно использовать комбинацию 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:]]' удаляет все кроме видимых символов.
11
ответ дан 3 April 2015 в 18:09

Можно распечатать каждый символ файла в отдельной строке с помощью 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
8
ответ дан 3 April 2015 в 18:09

Ох, забава! Вот несколько путей. Самое простое (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
3
ответ дан 3 April 2015 в 18:09

Просто удалите дублирующиеся символы из входной строки. 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
2
ответ дан 3 April 2015 в 18:09

Другие вопросы по тегам:

Похожие вопросы: