如何统计每行中文字符数量并追加至行尾,使用sed、awk等命令实现
可行实现方案
最优方案(awk内置方法,效率最高)
awk原生内置length()函数,在UTF-8 locale环境下可以直接统计中文字符数量,无需调用外部命令:
- 先执行命令预览输出效果,避免改错文件:
# 先设置locale为UTF-8,确保统计的是字符数而非字节数 export LC_ALL=zh_CN.UTF-8 awk '{print $0, length($0)}' myfile
- 确认输出符合预期后,直接修改原文件:
如果使用GNU awk 4.1及以上版本,可直接用内置inplace参数修改原文件:
awk -i inplace '{print $0, length($0)}' myfile
低版本awk可以用临时文件中转实现原文件修改:
awk '{print $0, length($0)}' myfile > tmp_file && mv tmp_file myfile
如果需要忽略行首尾的空白字符,只统计词汇本身的长度,可以调整命令为:
awk '{gsub(/^[[:space:]]+|[[:space:]]+$/,"",$0); print $0, length($0)}' myfile
原有写法错误原因
- sed本身没有内置的长度计算能力,也不能直接在替换规则中调用shell变量/命令,因此你尝试的两个sed命令都无法生效。
- 你写的awk命令错误使用了
system()函数,该函数返回的是外部命令的退出状态码而非输出结果,且嵌套awk的语法也完全错误,不需要额外调用外部awk命令,直接用内置length()即可实现需求。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

