1

У меня есть файл, который содержит строки.

Как мне написать скрипт, который найдет и распечатает каждое слово в файле, по одному слову в строке.

Затем найдите и распечатайте наиболее встречающееся слово (с учетом регистра) и количество вхождений этого слова в файл.

5 ответов5

3

Оболочка оболочки:

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

Удалите знаки препинания перед подсчетом слов и сделайте слова строчными (на английском языке):

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

Эта команда делает следующее:

  1. Замените все не алфавитно-цифровые символы пробелом.
  2. Все разрывы строк также преобразуются в пробелы.
  3. Уменьшает все несколько пробелов до одного пробела
  4. Все пробелы теперь преобразуются в разрывы строк. Каждое слово в строке.
  5. Переводит все слова в нижний регистр, чтобы избежать «Hello» и «Hello», чтобы быть разными словами
  6. Сортировка текста
  7. Считает и удаляет равные линии
  8. Сортирует в обратном порядке, чтобы посчитать самые частые слова
  9. Добавьте номер строки к каждому слову, чтобы узнать значение слова в целом

Например, если я хочу проанализировать первое сообщение Линуса Торвальда:

От: torvalds @ klaava.Хельсинки.FI (Линус Бенедикт Торвальдс) Группы новостей: comp.os.minix Тема: Что бы вы хотели увидеть больше всего в minix? Резюме: небольшой опрос для моей новой операционной системы. Message-ID: <1991Aug25.205708.9541@klaava.Хельсинки.FI> Дата: 25 августа 91 20:57:08 GMT Организация: Университет Хельсинки

Привет всем, кто использует Minix -

Я делаю (бесплатную) операционную систему (просто хобби, она не будет большой и профессиональной, как gnu) для 386 (486) клонов AT. Это варилось с апреля и начинает готовиться. Я хотел бы получить какие-либо отзывы о вещах, которые людям нравятся / не нравятся в minix, так как моя ОС чем-то напоминает это (такая же физическая структура файловой системы (по практическим причинам) среди прочего)

В настоящее время я портировал bash (1.08) и gcc (1.40), и кажется, что все работает. Это подразумевает, что я получу что-то практичное в течение нескольких месяцев, и я хотел бы знать, какие функции хотели бы получить большинство людей. Любые предложения приветствуются, но я не буду обещать, что буду их реализовывать

Линус (torvalds@kruuna.helsinki.fi)

PS. Да - он свободен от любого кода minix и имеет многопоточный fs. Он НЕ переносим (использует 386 переключений задач и т.д.) И, вероятно, никогда не будет поддерживать ничего, кроме жестких дисков AT, поскольку это все, что у меня есть :-(.

Я создаю файл с именем linus.txt, вставляю содержимое и затем пишу в консоли:

sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

Выход будет:

 1        7 i
 2        5 to
 3        5 like
 4        5 it
 5        5 and
 6        4 minix
 7        4 a
 8        3 torvalds
 9        3 of
10        3 helsinki
11        3 fi
12        3 any
13        2 would
14        2 won
15        2 what
16        ...

Если вы хотите визуализировать только первые 20 слов:

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 | head -n 20

Важно отметить , что команда тр аз «AZ» «» не SUPORT UTF-8 еще, так что на иностранных языках слово Apres бы перевести как Apres.

1
#!/bin/bash
cat /dev/stdin
printf "\n"
sort | uniq -c | sort -nr

Этот простой скрипт будет действовать как счетчик частоты слов, просто используя sort и uniq и соединяя их вместе. Сначала он выводит из stdin с помощью cat , чтобы показать вход. Затем он печатает новую строку. Наконец, он сортирует stdin , подсчитывает количество уникальных слов с помощью uniq -c , затем снова сортирует список, но с опциями n и r, чтобы упорядочить список численно и перевернуть список так, чтобы самые частые слова появлялись первыми. Поскольку он читает из стандартного потока ввода, назовите его так: script < inputfile .

0

Это должно дать вам начало работы с:

#!/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";
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"

Заметки:

  • $(<file) - сокращение от bash для $(cat file) - возвращает содержимое файла.
  • поскольку $(<file) сам по себе не заключен в двойные кавычки, оболочка разделит его на слова, а цикл for будет повторять слова.
  • вам нужна версия 4 bash для ассоциативных массивов
  • <opinion> Я не знаю, почему люди жалуются на уродливый синтаксис perl: понимаете ли вы, как вы должны обрабатывать массивы в bash? </opinion>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .