Listando todas as palavras em um arquivo de texto e encontrando a palavra mais frequente

1

Eu tenho um arquivo que contém linhas.

Como escrevo um script que irá encontrar e imprimir cada palavra no arquivo, uma palavra por linha.

Em seguida, localize e imprima a palavra que ocorre mais (diferencia maiúsculas de minúsculas) e o número de ocorrências dessa palavra no arquivo.

    
por SIlent pain 18.10.2013 / 10:31

5 respostas

3

Um oneliner de conchas:

cat file.txt | sed -r 's/[[:space:]]+/\n/g' | sed '/^$/d' | sort | uniq -c | sort -n | tail -n1

Remova a pontuação antes de contar palavras e diminua as palavras (em inglês):

cat file.txt | tr 'A-Z' 'a-z' | sed 's/--/ /g' | sed 's/[^a-z ]//g' | tr -s '[[:space:]]' '\n' | sort | uniq -c | sort -n | tail -n1
    
por 18.10.2013 / 13:21
2
 sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

Este comando faz o seguinte:

  1. Substitua todos os caracteres não alfanuméricos por um espaço em branco.
  2. Todas as quebras de linha são convertidas em espaços também.
  3. Reduz todos os vários espaços em branco para um espaço em branco
  4. Todos os espaços agora são convertidos em quebras de linha. Cada palavra em uma linha.
  5. Traduz todas as palavras para minúsculas para evitar que 'Olá' e 'olá' sejam palavras diferentes
  6. Classifica o texto
  7. Conta e remove as linhas iguais
  8. Ordena reversão para contar as palavras mais frequentes
  9. Adicione um número de linha a cada palavra para saber a palavra posotion em todo

Por exemplo, se eu quiser analisar a primeira mensagem de Linus Torvald:

From: [email protected] (Linus Benedict Torvalds) Newsgroups: comp.os.minix Subject: What would you like to see most in minix? Summary: small poll for my new operating system Message-ID: <[email protected]> Date: 25 Aug 91 20:57:08 GMT Organization: University of Helsinki

Hello everybody out there using minix –

I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I’d like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things).

I’ve currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I’ll get something practical within a few months, and I’d like to know what features most people would want. Any suggestions are welcome, but I won’t promise I’ll implement them

por 26.12.2016 / 22:17
1
#!/bin/bash
cat /dev/stdin
printf "\n"
sort | uniq -c | sort -nr

Esse script simples atuará como um contador de frequência de palavras usando sort e uniq e unindo-os. Primeiro, imprime a partir do stdin usando cat para mostrar a entrada. Em seguida, imprime uma nova linha. Por fim, classifica stdin , conta o número de palavras únicas com uniq -c , depois ordena a lista novamente, mas com as opções n e r para ordenar numericamente a lista e inverter a lista para que as palavras mais frequentes apareçam primeiro. Como ele lê o fluxo de entrada padrão, chame-o assim: script < inputfile .

    
por 18.10.2013 / 13:21
0

Isso deve ajudá-lo a começar a trabalhar com:

#!/usr/bin/perl
use strict;
use warnings;

#Read the file
open my $in, ';
close $in;

#Split the lines of the file into an array of words
my @words;
foreach my $line (@lines)
{
    push @words, (split(/[^\W]/, $line));
}

#Count the occurrences of each word (to evolve into a MapReduce fashion if the file is tremendously big)
my %word_count;
foreach my $word (@words)
{
    $word_count{$word}++;
}

#Find the word with the most occurrences
my $most_frequent_word='';
my $max=0;
foreach $word (keys %word_count)
{
    if ($word_count{$word} -gt $max)
    {
        $max = $word_count{$word};
        $most_frequent_word = $word;
    }
}
#Print results
print "Most frequent word : $most_frequent_word\n";
print "Occurrences : $max\n";
    
por 18.10.2013 / 11:14
0
#!/bin/bash
file=$1
declare -A count
for word in $(< "$file"); do
    echo $word
    (( count[$word]++ ))
done

max=0
for word in "${!count[@]}"; do
    if (( ${count[$word]} > $max )); then
        max=${count[$word]}
        max_word=$word
    fi
done
echo "most seen word: '$max_word', seen $max times"

Notas:

  • $(<file) é uma abreviação de $(cat file) - retorna o conteúdo do arquivo
  • porque $(<file) não é citado duas vezes, o shell irá dividi-lo em palavras e o loop for irá iterar sobre as palavras.
  • você precisa da versão 4 do bash para matrizes associativas
  • <opinion> Eu não sei porque as pessoas reclamam que a sintaxe do perl é feia: você vê como tem que lidar com arrays no bash? %código%
por 18.10.2013 / 12:22