LINUX.ORG.RU

программа вывода процента встречаемости слов в тексте


0

1

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

#!/bin/bash ARGS=1 if [ $# -ne «$ARGS» ] # проверка на колво аргументов then echo «Порядок использования: `basename $0` filename» exit fi

sed -e 's/\.//g' -e 's/ /\ /g' «$1» | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr

exit 0

Отношение количества искомых слов к общему количеству слов, не?

Nervous ★★★★★
()
Ответ на: комментарий от adriano32

Только wc -w будет и всякие предлоги считать. Надо еще как-нибудь минимальную длину слова ограничить.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от buganych

Спроси это у того, у кого ты скопипастил скрипт.
И
man sed
man tr
man sort
man uniq

Вот как разберёшь то, что ты в ОП скопипастил, придёшь спрашивать.

adriano32 ★★★
()
Ответ на: комментарий от buganych

Я серьёзно, пока ты не разберёшься, как работает этот скрипт, нечего здесь вопрошать, как его доделать до того состояния, что тебе нужно.

adriano32 ★★★
()

Кстати, для 'A-Z' 'a-z' есть определения '[:upper:]' и '[:lower:]', которая, в отличие от 'A-Z' 'a-z', работает и для русского языка:

17:14 /dev/shm
echo "Проверка Замены РЕГИСТРА" | tr  '[:upper:]' '[:lower:]'
проверка замены регистра
17:14 /dev/shm
echo "Проверка Замены РЕГИСТРА" | tr '[:lower:]'  '[:upper:]'            
ПРОВЕРКА ЗАМЕНЫ РЕГИСТРА

Удалить короткие слова и знаки препинания вы можете, например, sed'ом.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от buganych

А в какую надо?

Вывод можно и в файл перенаправить, если вы этого хотите.

Удобно было бы сначала sed'ом прошерстить исходный файл и создать промежуточный временный файл, в который скинуть только слова, длиннее, скажем, 2 букв (заодно и привести их все к нижнему регистру).

Затем в отдельную переменную заносим кол-во слов в этом файле (wc -w).

Затем считаем количество одинаковых слов и для каждого слова вычисляем процент (при помощи, например, awk можно выделить число из строки число-слово, затем отправить на вход bc выражение «scale=2;(100*число)/кол-во слов», а результат вывести либо на экран, либо в файл.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Подскажите, пожалуйста, как построчно раскидать файл с помощью awk? у меня отделяются слова от их количества и выводятся в два файла.

buganych
() автор топика
Ответ на: комментарий от buganych
17:29 /Data/documents
STR="12 слов"   
18:30 /Data/documents
N=$(echo $STR | awk 'print $1')
awk: print $1
awk: ^ syntax error
18:30 /Data/documents
N=$(echo $STR | awk '{print $1}')
18:30 /Data/documents
W=$(echo $STR | awk '{print $2}')
18:30 /Data/documents
ALL=234
18:31 /Data/documents
P=$(echo "scale=2; 100*$N/$ALL" | bc)
echo -e "$P\t\t$W"
5.12		слов

Понятно?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

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

3 and 2 the 2 technical 2 of 2 by 1 world 1 with 1 vehicles 1 up 1 universities 1 Tomsk 1 to 1 tasks 1 take 1 staff 1 space 1 solutions 1 sites 1 Russia 1 research 1 power 1 over 1 our 1 other 1 never 1 launch 1 its 1 is 1 intelligent 1 in 1 hesitate 1 fundamental

buganych
() автор топика
Ответ на: комментарий от buganych

Е-мое. Все элементарно же. 1 - это файл, вместо него подставляйте имя своего файла. Внутри цикла делайте все нужные вычисления:

... (получаем файлы со всеми словами и с кол-вом слов)
ALL=$(wc -w файл_со_всеми_словами)
while read Num Word
do
    Proc=$(echo "scale=2; 100*$Nun/$ALL" | bc)
    echo -e "Proc%\t\tWord" >> выходной_файл
done < файл_со_списком

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я не знаю, может у меня руки-крюки, но выдает Proc%      Word (standard_in) 2: syntax error на каждую строчку. Взгляните пожалуйста на текст скрипта

ALL=$(wc -w $1) ARGS=1 if [ $# -ne «$ARGS» ] # проверка на колво аргументов then echo «Порядок использования: `basename $0` filename» exit fi

sed -e 's/\.//g' -e 's/ /\ /g' «$1» | tr -sc A-Za-z '\012' | sort | uniq -c | sort -nr > temp

while read Num Word do Proc=$(echo «scale=2; 100*$Num/$ALL» | bc)

echo -e «$Proc%\t\t$Word» done < temp

exit 0

buganych
() автор топика
Ответ на: комментарий от buganych

Используйте теги code, чтобы читать было понятно.

tr -sc A-Za-z '\012' замените на upper-lower.

Разбейте по-человечески скрипт на строчки, если не хотите отделять команды друг от друга знаком ;

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

да со словами у меня проблем нет, файл temp выглядит правильно, т.е. количество - слово. у меня проблема в цикле, скрипт на него выводит ошибку

buganych
() автор топика
Ответ на: комментарий от buganych

Я же говорю: оформляйте по-человечески, если не хотите команды ";" разделять. Где разделитель перед echo?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em
 
ALL=$(wc -w $1)
ARGS=1
if [ $# -ne "$ARGS" ]  # проверка на колво аргументов
then
  echo "Порядок использования: `basename $0` filename"
  exit 
fi
sed -e 's/\.//g'  -e 's/ /\
/g' "$1" | tr -sc A-Za-z '\012' | sort | uniq -c | sort -nr > temp 

while read Num Word
do
Proc=$(echo "scale=2; 100*$Num/$ALL" | bc)
echo -e "$Proc%\t\t$Word" > ttt 
done < temp

exit 
buganych
() автор топика
Ответ на: комментарий от buganych

Ошибок у вас полным-полно. Кроме того, отсутствует отбрасывание пустых строк и знаков препинания. Пока вот что получается:

#!/bin/bash
if [ $# != 1 ]  # проверка на колво аргументов
then
  echo "Порядок использования: `basename $0` filename"
  exit 
fi
ALL=$(cat $1 | wc -w)
sed -e 's/\./\n/g' -e 's/,/\n/g'  -e 's/ /\n/g' "$1" | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -nr > temp 

while read Num Word
do
Proc=$(echo "scale=2; 100*$Num/$ALL" | bc)
echo -e "$Proc%\t\t$Word" >> ttt 
done < temp
При прогоне с файлом
cat text 
проверка количества слов, встречающихся в тексте, количества слов, слов, в тексте, да
Получаю:
cat ttt
8.33%		встречающихся
41.66%		
25.00%		слов
16.66%		тексте
16.66%		количества
16.66%		в
8.33%		проверка
8.33%		да
8.33%		встречающихся
41.66% - пустые строки. Их надо предварительно отбросить.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от buganych

ну это я и сам найду. спасибо вам преогромнейшее!!!

buganych
() автор топика
Ответ на: комментарий от buganych

Кроме вот такого ничего на ум не приходит:

#!/bin/bash
if [ $# != 1 ]  # проверка на колво аргументов
then
  echo "Порядок использования: `basename $0` filename"
  exit 
fi
ALL=$(cat $1 | wc -w)
sed 's/ /__BBB__/g' "$1" | tr -d '[:space:]'| sed 's/__BBB__/\n/g' | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -nr > temp 

while read Num Word
do
Proc=$(echo "scale=2; 100*$Num/$ALL" | bc)
echo -e "$Proc%\t\t$Word" >> ttt 
done < temp

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Сразу удалять пробелы нельзя - иначе слово не сможем выделить. Т.е. надо сначала заменить пробелы на что-то, затем удалить все пустые строки и пробелы, затем заменить «что-то» символом перевода строки (чтобы было по 1 слову в строке), удалить пунктуацию, привести все к нижнему регистру.

Eddy_Em ☆☆☆☆☆
()

awk '{for(i=1;i<=NF;i++) {w[$i]++; all++}}; END {for (k in w) {print k, w[k], w[k]*100/all"%«}}' text.txt

sdio ★★★★★
()
Ответ на: комментарий от buganych

В принципе этот код работает на ура, только он считает общее количество слов неправильно, если присутствуют символы вроде + или =. А так все просто безупречно! Спасибо вам огромное!

buganych
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.