【发布时间】:2011-12-21 15:40:33
【问题描述】:
我想找到我的.txt 文件中使用的所有标点符号,并计算每个标点符号出现的次数。我该怎么做?我是新手,但我正在努力学习!这不是家庭作业!我现在一直在研究grep 和sed。
【问题讨论】:
标签: unix command-line sed tr
我想找到我的.txt 文件中使用的所有标点符号,并计算每个标点符号出现的次数。我该怎么做?我是新手,但我正在努力学习!这不是家庭作业!我现在一直在研究grep 和sed。
【问题讨论】:
标签: unix command-line sed tr
$ perl -CSD -nE '$seen{$1}++ while /(\pP)/g; END { say "$_ $seen{$_}" for keys %seen }' sometextfile.utf8
如
$ perl -CSD -nE '$seen{$1}++ while /(\pP)/g; END { say "$_ $seen{$_}" for keys %seen }' programming_perl_4th_edition.pod | sort -k2rn
, 21761
. 19578
; 10986
( 8856
) 8853
- 7606
: 7420
" 7300
_ 5305
’ 4906
/ 4528
{ 2966
} 2947
\ 2258
@ 2121
# 2070
* 1991
' 1715
“ 1406
” 1404
[ 1007
] 1003
% 881
! 838
? 824
& 555
— 330
‑ 72
– 41
‹ 16
› 16
‐ 10
⁂ 10
… 8
· 3
「 2
」 2
« 1
» 1
‒ 1
― 1
‘ 1
• 1
‥ 1
⁃ 1
・ 1
如果您不仅需要标点符号,还需要标点符号和符号,请在您的模式中使用[\pP\pS]。不过,无论您做什么,都不要使用旧式 POSIX 类。
【讨论】:
使用 sed、tr、sort 和 uniq(而不是 perl):
sed -E 's/[^[:punct:]]//g;s/(.)/\1x/g' myfile.txt | tr 'x' '\n' | sort | uniq -c
我是这样做的(sed + tr),所以它可以在 unix 和 mac 上运行。 Mac 需要在 sed 命令中嵌入换行符,但 unix 可以使用 \n。这样它就可以在任何地方工作。
这将适用于非 mac Unix:
sed -E 's/[^[:punct:]]//g;s/(.)/\1\n/g' myfile.txt | sort | uniq -c
【讨论】:
[[:punct:]] 表示“UTF8 中的标点符号”而不是“某些 SBCS 中的标点符号”,可以肯定吗?您能确定问题在 POSIX 标准中指定的位置吗?
\pP 而不是[\pP\pS]。)这也可能归结为提问者想要被视为标点符号的内容 - 以及“标准的美妙之处在于有这么多可供选择”。