Я хочу создать выходной файл, который показывает частоту каждого слова во входном файле. После недолгих поисков я обнаружил, что Perl — идеальный язык для решения этой задачи, но я не знаю этого языка.
После еще нескольких поисков я нашел следующий код здесь, в stackoverflow, предположительно, он обеспечивает решение, которое я хочу, с большой эффективностью:
perl -lane '$h{$_}++ for @F; END{for $w (sort {$h{$b}<=>$h{$a} || $a cmp $b} keys %h) {print "$h{$w}\t$w"}}' file > freq
Я попытался запустить эту командную строку, используя форму ниже:
perl -lane 'code' input.txt > output.txt
Выполнение останавливается из-за неожиданного '>' (тот, что в '<=>'). Я провел некоторое исследование, но не могу понять, что не так. Может ли кто-нибудь просветить меня? Спасибо!
Вот тема, откуда я взял код: Элегантные способы подсчета частоты слов в файле
Если это уместно, мои слова используют буквы и цифры и разделяются одним пробелом.
Каково фактическое сообщение об ошибке?
Возможный дубликат Почему мой однострочный Perl не работает в Windows?
Вы, вероятно, используете Windows. Поэтому вам нужно использовать двойные кавычки "
вместо одинарных кавычек '
вокруг вашего кода:
perl -lane "$h{$_}++ for @F; END{for $w (sort {$h{$b}<=>$h{$a} || $a cmp $b} keys %h) {print qq($h{$w}\t$w)}}" file > freq
Также обратите внимание, как я использовал qq()
вместо "..."
в коде, как предложил @mob. Другой вариант — избежать кавычек с помощью \"
.
Будет ли экранирование кавычек работать? Если нет, синтаксис qq{}
предлагает обходной путь (print qq[$h{$w}\t$w]
).
@mob, я попробовал это на Windows, и это сработало, но я не уверен, что это работает во всех ситуациях. Собираюсь отредактировать ваше предложение qq{}
в ;)
Возможно, вы захотите ознакомиться с этой статьей о Perl Maven, в которой объясняется, как написать скрипт для получения частоты слов. perlmaven.com/count-words-in-text-using-perl