O que é uma maneira prática de listar todos os caracteres usados em um arquivo (Bash) (Regex)

3

Como posso transformar isso:

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

Para isso:

 abcdefghiklnoprstuwFJT',():.

(Estes são os caracteres totais usados na entrada)

Por favor, note que os caracteres pequenos "jmqvz" não estavam na sentença de entrada, portanto, não são produzidos.

A ordem não é importante, mas em letras minúsculas e maiúsculas, então os caracteres especiais serão preferidos.

Tenho certeza de que precisarei de sed / awk / etc. para isso, mas eu não encontrei nada semelhante após uma extensa pesquisa.

    
por TuxForLife 03.04.2015 / 04:56

4 respostas

9

Você pode usar uma combinação de sed e 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 faz ordenação lexicográfica, então veja man 7 ascii para ver como os caracteres serão ordenados.

Explicação:

  • sed 's/./&\n/g' - adiciona uma nova linha após cada caractere, pois sort (geralmente) faz a classificação linha por linha
  • LC_COLLATE=C define o estilo de agrupamento como C (consulte O que significa “LC_ALL = C 'fazer? )
  • sort -u : classifica a entrada e imprime somente as entradas exclusivas
  • tr -d '\n' exclui todas as novas linhas extras.

Se você quiser manter apenas caracteres visíveis:

$ 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:]]' exclui tudo, exceto os caracteres visíveis.
por muru 03.04.2015 / 05:14
8

Você pode imprimir todos os caracteres de um arquivo em uma linha separada usando fold -w1 , depois classificar a saída e eliminar as duplicatas com sort -u (ou 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

Depois, você pode transformar isso em uma única linha novamente, por exemplo, com paste -sd "" - :

$ fold -w1 test | sort -u | paste -sd "" -
 ,:.'()abcdefFghiJklnoprstTuwxy
    
por Nykakin 03.04.2015 / 10:57
3

Ooh, divertido! Aqui estão algumas maneiras. O mais simples ( fold ) já foi dado, mas aqui está uma maneira de expandir isso para dar as contagens de cada caractere também:

$ 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

O uso de LC_ALL=C define a localidade como C para o comando sort , o que significa que os CAPITALS são classificados antes dos casos mais baixos, conforme solicitado. Para obter tudo na mesma linha sem contar as ocorrências, mas com a mesma ordem de classificação, você poderia fazer

$ echo $(fold -w 1 file | LC_ALL=C sort -u | tr -d '\n')
"'(),.:FJTabcdefghiklnoprstuwxy

Você também pode usar o Perl:

$ perl -lne '$k{$_}++ for split(//); END{print sort keys(%k)}' file
"'(),.:FJTabcdefghiklnoprstuwxy

Por fim, aqui está uma maneira que também mostra caracteres especiais, como guias, novas linhas e retornos de carro:

$ 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
    
por terdon 03.04.2015 / 16:05
2

Basta remover os caracteres duplicados da string de entrada. A função set em python criaria um conjunto de itens sem qualquer duplicata. Por exemplo, set('ssss') fornecerá um único s .

Através do 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

Se você quiser remover os caracteres duplicados presentes no arquivo inteiro, tente isso.

$ python3 -c 'import sys
with open(sys.argv[1]) as f:
    print("".join(sorted(set(f.read()))))' file
    
por Avinash Raj 03.04.2015 / 05:28

Tags