免费注册 查看新帖 |

Chinaunix

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

[文本处理] 【已解决】awk的hard quote问题 [复制链接]

论坛徽章:
2
15-16赛季CBA联赛之八一
日期:2017-07-06 14:20:4715-16赛季CBA联赛之上海
日期:2017-08-21 22:14:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-06-28 23:53 |只看该作者 |倒序浏览
本帖最后由 irockey 于 2017-07-06 21:05 编辑

其实算是一个新人面试题

shell里面怎么统计文本中单词出现的次数


没想到怎么解决,然后百度了下,找到了结果,不过测试后发现语句报错

awk 'BEGIN{RS="[,.!?-'" ]"}{w[$0]+=1}END{for(a in w) print a"\t"w[a]}' file.txt


        将,.!?-'" 这些字符指定为行分隔符【空格在"后面】,然后使用数据,将单词设为下标,进行加1处理,最后打印
在执行后发现语句问题
执行报错:
-bash: syntax error near unexpected token `('
虽然对hard quote有所了解,但在这里真不知道该怎么处理。感觉有点钻牛角尖了!


论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2017-06-29 06:07 |只看该作者
回复 1# irockey

issue 1: single quote

$ awk 'BEGIN{RS="[,.!?-'" ]"}{w[$0]+=1}END{for(a in w) print a"\t"w[a]}' file.txt
bash: syntax error near unexpected token `('

solution: change it to hexadecimal of ascii code

$ ascii "Single Quote"      # or   $ ascii "'"
ASCII 2/7 is decimal 039, hex 27, octal 047, bits 00100111: prints as `''

------------------------------------------------------------------------
issue 2: double quote
Single Quote change to \x27

$ awk 'BEGIN{RS="[,.!?-\x27" ]"}{w[$0]+=1}END{for(a in w) print a"\t"w[a]}' file.txt
awk: cmd. line:1: BEGIN{RS="[,.!?-\x27" "}{w[$0]+=1}END{for(a in w) print a"\t"w[a]}
awk: cmd. line:1:                       ^ syntax error
awk: cmd. line:1: BEGIN{RS="[,.!?-\x27" ]"}{w[$0]+=1}END{for(a in w) print a"\t"w[a]}
awk: cmd. line:1:                                                            ^ backslash not last character on line

solution: change it to \" or \x22 in double quote string


------------------------------------------------------------------------
issue 3: Hyphen issue
$ awk 'BEGIN{RS="[,.!?-\x27\" ]"}{w[$0]+=1}END{for(a in w) print a"\t"w[a]}' file.txt
awk: cmd. line:1: fatal: Invalid range end: /[,.!?-'" ]/

[1-3  will be => 1, 2, 3 or 4
[-13]  will be => -, 1 or 3
[13-]  will be => 1, 3 or -
Note: Hyphen must be in head or tail

Solution: place it to head or tail between [ and ]

$ awk 'BEGIN{RS="[,.!?\x27\" -]"}{w[$0]+=1}END{for(a in w) print a"\t"w[a]}' file.txt
...


论坛徽章:
0
3 [报告]
发表于 2017-06-29 15:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
15-16赛季CBA联赛之八一
日期:2017-07-06 14:20:4715-16赛季CBA联赛之上海
日期:2017-08-21 22:14:34
4 [报告]
发表于 2017-06-30 00:11 |只看该作者
回复 2# jason680

对awk的元字符处理还不够熟悉,双引号有试过转义。不过因为-的原因,没能定位原因!谢谢指导

假设文章内容
  1. [root@154 ~]# cat file
  2. i love you!
  3. miss you,tomorrow?
  4. 'I miss you tomorrow!'
  5. i tell you :'everything will be fine!'
  6. 1-2-3
复制代码
统计文中单词出现的次数,另外在排序
  1. [root@154 ~]# awk 'BEGIN{RS="[,.!?:\"\n\x27 -]+"}{w[$0]+=1}END{for(a in w)print w[a]"\t"a}' file |sort -r
  2. 4        you
  3. 2        tomorrow
  4. 2        miss
  5. 2        i
  6. 1        will
  7. 1        tell
  8. 1        love
  9. 1        I
  10. 1        fine
  11. 1        everything
  12. 1        be
  13. 1        3
  14. 1        2
  15. 1        1
复制代码


论坛徽章:
2
15-16赛季CBA联赛之八一
日期:2017-07-06 14:20:4715-16赛季CBA联赛之上海
日期:2017-08-21 22:14:34
5 [报告]
发表于 2017-06-30 00:16 |只看该作者
回复 3# 本友会机友会摄友会

谢谢!
没有使用成功,主要是对.net不熟悉,没有接触过我是直接执行的
$a = 'aa bb cc bb cc cc' -split ' ' | Group-Object


结果报错
  1. -bash: Group-Object: command not found
  2. -bash: =: command not found
复制代码


可能没有理解你说的意思,菜鸟一个!

111.png (4.36 KB, 下载次数: 0)

运行示意图

运行示意图

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2017-06-30 06:34 |只看该作者
回复 4# irockey

$ cat file
[root@154 ~]# cat file
i love you!
miss you,tomorrow?
'I miss you tomorrow!'
i tell you :'everything will be fine!'
1-2-3
$


$ awk 'BEGIN{RS="[,.!?:\"\n\x27 -]+"}{w[$0]+=1}END{for(a in w)print w[a]"\t"a}' file |sort -r
4    you
2    tomorrow
2    miss
2    i
1    will
1    tell
1    [root@154
1    love
1    I
1    fine
1    file
1    everything
1    cat
1    be
1    3
1    2
1    1
1    $
1    ~]#


#try this way ...

$ perl -lne '{$RE=qr/([A-Za-z]+|\d+)/;@a=split($RE);for(@a){/^$RE$/&&++$c{$_}}}END{print "$c{$_}\t$_" for(keys %c)}' file | sort -r
4    you
2    tomorrow
2    miss
2    i
1    will
1    tell
1    root
1    love
1    I
1    fine
1    file
1    everything
1    cat
1    be
1    3
1    2
1    154
1    1




论坛徽章:
0
7 [报告]
发表于 2017-06-30 13:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
15-16赛季CBA联赛之八一
日期:2017-07-06 14:20:4715-16赛季CBA联赛之上海
日期:2017-08-21 22:14:34
8 [报告]
发表于 2017-07-01 00:48 |只看该作者
回复 6# jason680

万分感谢,不过没有使用过perl,但一直听说perl的正则很好用
感觉有必要学习下perl,发现自己还有太多太多的东西要学习!

论坛徽章:
2
15-16赛季CBA联赛之八一
日期:2017-07-06 14:20:4715-16赛季CBA联赛之上海
日期:2017-08-21 22:14:34
9 [报告]
发表于 2017-07-01 00:55 |只看该作者
回复 7# 本友会机友会摄友会

跪谢,要学习的东西太多了,看来不止是知识技能少,连知识面都接触的太少!
谢谢耐心回帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP