2016-11-04 2 views
0

У меня есть список ячеек,Как подсчитать повторяющиеся слова из списка

  1. U1864
  2. u_dhm_lut/U4
  3. u_dhm_lut/lut_out_reg_2_
  4. u_dhm_lut/lut_in_reg_2_

И Я хочу рассчитать, сколько раз приходит каждое имя Результат будет:

  1. U1864 1
  2. u_dhm_lut/lut_out_reg_2_ 18
  3. u_dhm_lut/lut_in_reg_2_ 14
  4. u_dhm_lut/U4 10

код, как:

set cell_cnt [open "demo.txt" r] 
set cell [read $cell_cnt] 
set b [open "number_of_cell.txt" w+] 

proc countwords {cell_count} { 
set unique_name [lsort -unique $cell_count] 
foreach count $unique_name { 
set cnt 0 
foreach item $cell_count { 
if {$item == $count} { 
incr cnt 
} 
} 
puts $b "$count :: $cnt" 
} 
} 

countwords $cell 

Он говорит, что не может read "b": нет такой переменной при выполнении "ставит $ b" $ count :: $ cnt "" Почему я не могу написать файл внутри proc?

+0

Это * другой * FAQ. Причина, по которой ваш код в процедуре не может использовать переменную «b», заключается в том, что она является глобальной. Используйте :: b или вызовите команду «global b» (без кавычек) перед использованием переменной. Кроме того, рассмотрите возможность использования немного более простого кода для подсчета частоты (например, в моем ответе). В будущем вы будете благодарны вам, если вы когда-нибудь снова будете работать с тем же кодом. –

ответ

1

Код внутри области процедуры не может использовать переменные, определенные вне этой области действия, например. глобальные переменные. Для того, чтобы иметь возможность использовать глобальные переменные, вы можете импортировать их в процедуре рамки:

proc countwords cell_count { 
    global b 

или использовать уточненное имя:

puts $::b ... 

Вы также можете обойти проблему, передавая дескриптор файла в Процедура:

proc countwords {b cell_count} { 

... 

countwords $b $cell 

или переместить код для открытия файла внутри процедуры (не рекомендуется: процедуры должны иметь только одно задание).

Старый ответ, основанный на названии вопроса

Это один из наиболее часто задаваемых часто задаваемых вопросов. Если вы посмотрите некоторое время назад в список вопросов, вы найдете немало ответов на это.

Решение на самом деле довольно простое, и его суть состоит в том, чтобы использовать массив в качестве частотной таблицы со словами как ключами и частотами в качестве значений. Команда incr создает новые записи (со значением один) в таблице по мере необходимости.

foreach word $words { 
    incr count($word) 
} 

В результате так же легко проверить:

parray count 

В результате, конечно, может быть также использован в сценарии, в любом случае, что массив может быть использован.

Документация: array, foreach, incr, parray

+1

Словари также хорошо работают как таблицы частот. –

+0

Хорошо, позвольте мне проверить это ... Спасибо ... – CLEX420

0

Вы можете использовать открытый код файла "набор т.е. б [открыть "number_of_cell.txt" W +]" внутри метода. Это также должно решить вашу проблему.

+0

Спасибо ... мне это не приходило в голову ... – CLEX420