首页 > 解决方案 > 计算汉字个数并添加到行尾

问题描述

我有一个文件,每行都有一个中文单词,如下所示:

王大明 
新型传染病  
電子雷射 

我想在每一行的末尾添加汉字的数量:

王大明 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

标签: stringbashtext-processing

解决方案


究竟什么会起作用将完全取决于您的输入到底是什么样的。如果您正在处理 Unicode 字形,请使用可识别 Unicode 的工具,例如 Python。

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                 ..........

对于某些相关背景,也许另请参阅有关解码错误的问题。

如果你幸运的话,甚至是 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

推荐阅读