comando que pegará um arquivo e separará cada palavra para que fique na sua própria linha

1

Eu tenho um arquivo que tem cerca de 17523 palavras nele e eu preciso separe cada palavra para que fique na sua própria linha (uma palavra é definida como uma sequência contígua de letras, portanto, as palavras de 1 letra não contam) e para remover todas as linhas em branco. Eu não sei porque isso não está funcionando:

cat file.txt | tr [[:upper:]] [[:lower:]] | tr -d '\n' | tr " " '\n'
    
por alphaQ 29.09.2018 / 04:37

4 respostas

1

Tente:

cat file.txt | tr [[:upper:]] [[:lower:]] | tr '\n' ' ' | sed -E 's/[ \t]+/\n/g'

Seu tr -d '\n' está unindo todas as palavras removendo o espaçamento. O tr '\n' ' ' acima preserva o espaçamento.

Em seguida, o espaçamento precisa ser convertido em um espaço, o sed acima disso. Converte vários espaços (ou tabulações) [ \t]+ para uma nova linha de expressão \n .

    
por 29.09.2018 / 07:56
1

A opção -o do Grep é perfeita para isso: ela imprime cada partida em sua própria linha.

grep -E -o '[[:alpha:]]{2,}' file.txt

E se você quiser isso em minúsculas

grep -E -o '[[:alpha:]]{2,}' file.txt | tr '[:upper:]' '[:lower:]'

Note que o regex grep usa colchetes duplos e tr não: isso porque uma classe de caracteres em uma expressão regular precisa estar contida entre colchetes, enquanto tr não usa expressões regulares, ele usa conjuntos de caracteres.

    
por 29.09.2018 / 13:50
1

Para responder à pergunta no título:

command that will take a file and separate each word so its on its own line

Você poderia fazer:

<file tr '\n\t\r' ' '' '' ' | tr -s ' ' '\n'   # needs three spaces !

Ele irá converter novas linhas, tabulações e retornos de carro para espaços e, em seguida,… converter qualquer execução ( -s ) de espaços de volta para uma nova linha.

Você pode aproveitar o comando tr e usá-lo para também converter letras maiúsculas em minúsculas na mesma chamada:

<file tr '[:upper:]\n\t\r' '[:lower:]   ' | tr -s ' ' '\n'

Ou você pode fazer exatamente o mesmo no GNU sed (lembre-se de que isso vai sugar todo o arquivo para a memória e assume que não existem bytes NUL dentro do arquivo):

<file sed -zE -e 'y/A-Z\n\t\r/a-z   /;s/ +/\n/g'

Em seguida, para responder à pergunta no corpo:

(a word is defined to be a contiguous sequence of letters, so 1 letter words don't count) and to remove all blank lines.

você pode remover palavras com caracteres diferentes de a-z, palavras de um caractere e linhas vazias:

sed -E '/[^a-z]/d;/^.$/d;/^$/d'

Poderia ser reduzido para um pouco mais enigmático:

sed -E '/[^a-z]/d;/^(.|)$/d'

Tudo em uma linha:

<file tr '[:upper:]\n\t\r' '[:lower:]   ' | tr -s ' ' '\n' | sed -E '/[^a-z]/d;/^(.|)$/d'

Ou:

<file sed -zE -e 'y/A-Z\n\t\r/a-z   /;s/ +/\n/g' | sed -E '/[^a-z]/d;/^(.|)$/d'

Versão comentada (funciona no GNU sed):

# Source 'file' and use sed with the 'zero' option (-z) and Extended Regex (ERE '-E')
<file sed -zE -e '
    # Transliterate (-y) UPPER to lower and convert control to space.
y/A-Z\n\t\r/a-z   /
    # Restore consecutive spaces to **one** newline.
s/ +/\n/g
    # Second call to sed.
' | sed -E '
    # Delete (d) lines that have nay character not in the range a-z.
/[^a-z]/d
    # delete any line with one character or empty.
/^(.|)$/d
'
    
por 30.09.2018 / 00:01
0
cat file.txt | awk 'NF''{gsub(/ /,"\n"); print tolower($0)}'

O NF remove linhas contendo apenas espaços em branco ou tabulações, então gsub mudará espaços entre as palavras / / por novas linhas "\n" . finalmente, tolower($0) terá letras maiúsculas.

    
por 29.09.2018 / 13:36