如何解决计算汉字的个数并在行尾添加
我有一个文件,每行都有一个中文单词,如下所示:
王大明
新型传染病
電子雷射
我想在每行末尾添加汉字数:
王大明 3
新型传染病 5
電子雷射 4
我该怎么做?
我知道命令,sed,wc
。但是,我无法完成这项工作。我尝试了很多东西,但显然我需要帮助。
sed -i s/$/{length $0}/ myfile
sed -i s/$/{wc -m}/ myfile
awk '{$2=system(awk 'length') OFS $2} 1' myfile
解决方法
究竟什么有效将完全取决于您输入的内容。如果您正在处理 Unicode 字形,请使用可识别 Unicode 的工具,例如蟒蛇。
bash$ cat uniline
#!/usr/bin/env python3
import sys
for line in sys.stdin:
line = line.rstrip('\n')
print(line,len(line))
bash$ chmod +x uniline
bash$ uniline <<\:
> 王大明
> 新型传染病
> 電子雷射
> :
王大明 3
新型传染病 5
電子雷射 4
(在您发布的示例中,我不得不从行尾修剪一些空格。)
为了记录,我的系统编码是 UTF-8,这意味着第一行的字节表示是
bash$ echo '王大明' | xxd
00000000: e78e 8be5 a4a7 e698 8e0a ..........
也许还可以参见 Problematic questions about decoding errors 了解一些相关背景。
如果幸运的话,即使是 Awk 和 wc
也可能在您的平台上识别区域设置。您的 sed
尝试确实没有成功的机会(尽管如果您有 GNU sed
,您可以尝试使用 /e
选项;但实际上,可能不会)。如果您有 GNU Awk 并定义了 en_US.UTF-8
语言环境,这也适用:
bash$ echo $'\xe7\x8e\x8b\xe5\xa4\xa7\xe6\x98\x8e' |
> LC_ALL=en-US.UTF-8 awk '{ print $0,length }'
王大明 3
,
如果你非常确定唯一的多字节字符是中文,那么做
gawk/mawk/mawk2 '{ print $0,\
\
gsub(/\342|\343|\344|\345|\346|\347|\350|\351|\357|\360/,"&") }'
此前导字节列表应正确说明与简体和繁体中文字符相关的 3 或 4 字节代码点,以及所有特殊的兼容性变体。
以字节模式或 unicode 模式运行它,它会给你相同的结果。您的区域设置不在这里很重要(只要您的输入已经是 UTF8 兼容文本)
如果你肯定是字节模式或 LC_ALL=C,那么
awk '{ print $0,gsub(/[\342-\351\357\360]/,"&") }'
gsub()
的一个鲜为人知但非常出色的用例是将其用于计算出现次数的目的,而无需执行 split()
或 substr()
。
如果你对精确性真的很迂腐,我自己使用的可怕的正则表达式是
function isChinese(str6) { return (str6 ~
/\344|\345|\346|\347|\350|\351|
(\343|\360|\357)(\244|\245|\246|\247|
\250|\251|\252|\253)|(\357\271|
\343(\204|\207))(\200|\201|\202|\203|\204|
\205|\206|\207|\210|
\211|\212|\213|\214|\215|\216|\217)|(\343\206|
\357\270)(\260|\261|\262|\263|\264|\265|\266|\267|
\270|\271|\272|\273|\274|\275|\276|\277)|
(\343|\360)(\240|\241|\242|\243|\254|\255|\256|\257|\260|
\261)|\342(\272|\273|\274|\275|\276|\277(\200|
\210|\211|\212|\213|\214|\215|\216|\217))|
(\342\277|\343(\204|\206|\207))(\220|\221|\222|
\223|\224|\225|\226|\227|\230|\231|\232|\233|
\234|\235|\236|\237)|\343(\200|\210|\211|\212|
\213|\214|\215|\216|\217|\220|\221|\222|\223|
\224|\225|\226|\227|\230|\231|\232|\233|\234|
\235|\236|\237|\262|\263|\264|\265|\266|(\204|
\206|\207)(\240|\241|\242|\243|\244|
\245|\246|\247|\250|\251|\252|\253|\254|\255|\256|\257))/) };
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。