найти n наиболее часто встречающихся слов в файле со списком стоп-слов из командной строки

zenity не записывает результат вашего выбора в std-out. Попробуйте сами, запустив его в командной строке:

$ zenity --question
$

Как видите, ничего не отображается, поэтому ваши переменные TEST пусты.

Вместо этого zenity возвращает значение --question в качестве статуса выхода. Это можно посмотреть (в bash) с помощью внутренней переменной $?.

$ zenity --question

Выберите кнопку 'No':

$ echo $?
$ 1

Как объясняется на странице man, 0 означает 'Yes', 1 означает 'No', а 5 означает, что команда завершилась.

Таким образом, ваша команда должна выглядеть так:

$ zenity --question; echo test=$?
$ test=1

Обратите внимание, что разные команды zenity ведут себя по-разному. Как объясняет man-страница, команда --entry действительно отправляет свой вывод в std-out:

$ zenity --entry
$ Test 1..2..3..

Поэтому ваши тесты будут работать с этой конкретной командой.

4
13.04.2017, 15:36
2 ответа

Команда:

cat text.txt | tr ' ' '\n' | grep -v 'words\|word2' | sort | uniq -c | sort -nk1

Как это работает

Ниже приводится содержимое файла

$ cat file.txt

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

$ cat file.txt|tr ' ' '\n'| grep -v -w 'an\|a\|is'| sort| uniq -c| sort -nk1|tail
      1 unknown
      1 when
      2 and
      2 dummy
      2 Ipsum
      2 Lorem
      2 of
      2 text
      2 type
      3 the

Описание : Переведите пробел в новую строку, затем извлеките слова из списка, затем отсортируйте их и посчитайте для наиболее часто используемых

0
27.01.2020, 20:52

Рассмотрим этот тестовый файл:

$ cat text.txt
this file has "many" words, some
with punctuation.  some repeat,
many do not.

Чтобы получить количество слов:

$ grep -oE '[[:alpha:]]+' text.txt | sort | uniq -c | sort -nr
      2 some
      2 many
      1 words
      1 with
      1 this
      1 repeat
      1 punctuation
      1 not
      1 has
      1 file
      1 do

Как это работает

  • grep -oE '[[: alpha:]] +' text.txt

    Это возвращает все слова, без пробелов и знаков препинания, по одному слову в строке.

  • sort

    Сортировка слов в алфавитном порядке.

  • uniq -c

    Подсчитывает, сколько раз встречается каждое слово. (Для работы uniq его входные данные должны быть отсортированы.)

  • sort -nr

    Сортировка выходных данных численно так, чтобы наиболее часто встречающееся слово было вверху.

Обработка смешанного случая

Рассмотрим этот тестовый файл смешанного случая:

$ cat Text.txt
This file has "many" words, some
with punctuation.  Some repeat,
many do not.

Если мы хотим посчитать некоторые и некоторые как одно и то же:

$ grep -oE '[[:alpha:]]+' Text.txt | sort -f | uniq -ic | sort -nr
      2 some
      2 many
      1 words
      1 with
      1 This
      1 repeat
      1 punctuation
      1 not
      1 has
      1 file
      1 do

Здесь мы добавлен параметр -f в sort , чтобы он игнорировал регистр, и параметр -i для uniq , чтобы он также игнорировал кейс.

Исключение стоп-слов

Предположим, что мы хотим исключить эти стоп-слова из подсчета:

$ cat stopwords 
with
not
has
do

Итак, мы добавляем grep -v , чтобы исключить эти слова:

$ grep -oE '[[:alpha:]]+' Text.txt | grep -vwFf stopwords | sort -f | uniq -ic | sort -nr
      2 some
      2 many
      1 words
      1 This
      1 repeat
      1 punctuation
      1 file
6
27.01.2020, 20:52

Теги

Похожие вопросы