免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5806 | 回复: 10
打印 上一主题 下一主题

怎么获得汉字的首字母,用shell ? 初步实现了,哈哈 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-04 23:34 |只看该作者 |倒序浏览
本帖最后由 rabbitlcat 于 2011-06-07 21:12 编辑

就是想获得一个汉字语句的拼音首字母,用shell可实现不?用google搜了下没找到结果
问下论坛里牛人可行不?
比如:输入“中华民族”
输出:zhmz
用了一个很傻的方法,看到有人在excel里利用gb2312的一级汉字是按拼音排序的实现,根据那个得到如下
  1. 文件名:getInitial
  2. 在文本aabb里存入如下汉字:
  3. 我是中国人。
  4. #!/bin/bash
  5. for i in `od -An -tx2 $1`        
  6. #od -An -tx2 $1是把文件$1心十六进制打印出来
  7. do
  8.         ((temp=0x$i))
  9.         ((lsb=temp>>8))

  10.         ((temp=0x$i))
  11.         ((temp=temp&0xff))
  12.         ((msb=temp<<8))
  13.         ((num=msb|lsb))
  14.         #上面代码是因为linux是小端模式,所以要调换下高8位和低8位,这个算术操作就乱写的
  15.         if [ $num -ge 45217 ] && [ $num -lt 45253 ]
  16.         then
  17.                 echo a
  18.         fi
  19.         if [ $num -ge 45253 ] && [ $num -lt 45761 ]
  20.         then
  21.                 echo b
  22.         fi
  23.         if [ $num -ge 45761 ] && [ $num -lt 46318 ]
  24.         then
  25.                 echo c
  26.         fi
  27.         if [ $num -ge 46318 ] && [ $num -lt 46826 ]
  28.         then
  29.                 echo d
  30.         fi
  31.         if [ $num -ge 46826 ] && [ $num -lt 47010 ]
  32.         then
  33.                 echo e
  34.         fi
  35.         if [ $num -ge 47010 ] && [ $num -lt 47297 ]
  36.         then
  37.             echo f
  38.         fi
  39.         if [ $num -ge 47297 ] && [ $num -lt 47614 ]
  40.         then
  41.             echo g
  42.         fi
  43.         if [ $num -ge 47614 ] && [ $num -lt 48119 ]
  44.         then
  45.             echo h
  46.         fi
  47.         if [ $num -ge 48119 ] && [ $num -lt 49062 ]
  48.         then
  49.             echo j
  50.         fi
  51.         if [ $num -ge 49062 ] && [ $num -lt 49324 ]
  52.         then
  53.             echo k
  54.         fi
  55.         if [ $num -ge 49324 ] && [ $num -lt 49896 ]
  56.         then
  57.             echo l
  58.         fi
  59.         if [ $num -ge 49896 ] && [ $num -lt 50371 ]
  60.         then
  61.             echo m
  62.         fi
  63.         if [ $num -ge 50371 ] && [ $num -lt 50614 ]
  64.         then
  65.             echo n
  66.         fi
  67.         if [ $num -ge 50614 ] && [ $num -lt 50622 ]
  68.         then
  69.             echo o
  70.         fi
  71.         if [ $num -ge 50622 ] && [ $num -lt 50906 ]
  72.         then
  73.             echo p
  74.         fi
  75.         if [ $num -ge 50906 ] && [ $num -lt 51387 ]
  76.         then
  77.             echo q
  78.         fi
  79.         if [ $num -ge 51387 ] && [ $num -lt 51446 ]
  80.         then
  81.             echo r
  82.         fi
  83.         if [ $num -ge 51446 ] && [ $num -lt 52218 ]
  84.         then
  85.             echo s
  86.         fi
  87.         if [ $num -ge 52218 ] && [ $num -lt 52698 ]
  88.         then
  89.             echo t
  90.         fi
  91.         if [ $num -ge 52698 ] && [ $num -lt 52980 ]
  92.         then
  93.             echo w
  94.         fi
  95.         if [ $num -ge 52980 ] && [ $num -lt 53689 ]
  96.         then
  97.             echo x
  98.         fi
  99.         if [ $num -ge 53689 ] && [ $num -lt 54481 ]
  100.         then
  101.             echo y
  102.         fi
  103.         if [ $num -ge 54481 ] && [ $num -lt 55289 ]
  104.         then
  105.             echo z
  106.         fi
  107. done

  108. $: ./getInitial  aabb即可得到结果
复制代码
用GB2312的一级汉字,有很多弊端,比如刚才楼下同学说的多音字,还有很多汉字不能查找到,只能找到常用的汉字。
代码写的乱七八糟,

论坛徽章:
0
2 [报告]
发表于 2011-06-05 09:43 |只看该作者
  1. echo 你好 |sed -r "s:^(.).*$:\1:"   
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-06-05 12:10 |只看该作者
回复 2# 可爱的偏执狂
不好意思,我没说清楚,是获得汉字的拼音首字母

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
4 [报告]
发表于 2011-06-05 12:40 |只看该作者
perl python ruby 肯定可以

不用上面的的话要不联网要不查表,表是个外部文件

论坛徽章:
0
5 [报告]
发表于 2011-06-05 13:07 |只看该作者
回复 4# ziyunfei
恩啊,perl  ruby没了解过,python勉强知道点,google看到有python实现的,只是想有shell实现的话最好,呵呵

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
6 [报告]
发表于 2011-06-05 15:01 |只看该作者
一个shell, 一个数据文件

shell原理, 逐个提取一段字串的汉字. 查找数据文件中含有此字的行, 显示第一列的第一个字母.

数据文件格式(为什么选这样的? 你选个linux 输入法的词库就知道了^_^)

拼音 汉字1 汉字2 ....  (以空格为分隔符....)

例子:

a 啊 阿 吖 .....

wu 无 五 唔 吴

论坛徽章:
0
7 [报告]
发表于 2011-06-05 23:06 |只看该作者
这个好像很有难度{:3_184:}

论坛徽章:
0
8 [报告]
发表于 2011-06-07 09:06 |只看该作者
本帖最后由 springwind426 于 2011-06-07 09:10 编辑

  1. echo '中华民族' | awk 'NR==FNR{a[$1]=$2}NR!=FNR{split($0,b,"");for(i=1;i<=length(b);i++){printf substr(a[b[i]],1,1)};print ""}' pinyin -
  2. 输出  zhmz

  3. pinyin 是一个字典文件,每个汉字一行,格式是   汉字+空格+拼音

复制代码

论坛徽章:
0
9 [报告]
发表于 2011-06-07 11:31 |只看该作者
回复 8# springwind426
哇,谢谢啊,刚看了六楼的方法,还没来得及去尝试,你就实现了。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2011-06-07 16:22 |只看该作者
我在想,多音字怎么办
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP