Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21140
  • 博文数量: 5
  • 博客积分: 133
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-07 15:26
文章分类

全部博文(5)

文章存档

2011年(5)

我的朋友

分类: LINUX

2011-06-07 23:41:23

在水木社区的VIM版看到这样一个帖子,要求去掉文本中的重复单词。这个工作用VIM来完成有不太容易,但用awk来做就很简单。

发信人: lars (蓝天白云), 信区: VIM
标  题: 怎么去掉重复的单词?
发信站: 水木社区 (Thu Mar 22 13:44:01 2007), 站内

一段文字,包含很多单词,每两个单词之间有空格,怎么让所有重复的单词只剩下一个?
比如
ABC fff ddd ABC
eee ABC
替换后只剩下第一个ABC
thanks

发信人: Easwy (Easwy), 信区: VIM
标  题: Re: 怎么去掉重复的单词?
发信站: 水木社区 (Thu Mar 22 15:58:59 2007), 站内

awk could match your requirement.
save the following code as t.sh:
---
#! /bin/awk -f

{
    for (i = 1; i <= NF; i++)
    {
        ++word[$i]

        if (word[$i] == 1)
            printf("%s ", $i)
    }
    printf("\n")
}
---

and exec:
chmod u+x t.sh
./t.sh

简单介绍一下上面的awk脚本:
awk处理文本的方式是逐行处理,因此,对于文件的每一行,都会执行上面的for循环。在执行for循环时,awk已经把这一行中所有以空格间隔的单词都分隔开了,并保存在诸如$1,$2这样的变量中。NF则是这一行中所包含的字段的数目,也就是单词的个数。

for 循环的工作就是以该单词做为下标,计算文件中每个单词出现的次数。如果单词出现的次数为1,则输出此单词,否则不输出。这里用到了awk的关系数组?? awk的数组与C语言不同,数组的下标不仅可以是数字,也可以是一个字符串,也就是说,诸如word["hello"]这样的数组元素是允许的。上面的代码就是使用关系数组的一个例子。

在日常处理文本时,虽然VIM是最主要的文件编辑工具,但它并不是唯一可以高效完成工作的工具。在适当的时候,使用适当的工具,才是高效完成工作的最好方式。

生活不同于学校中的考试,所有的事情并不是仅有一个正确答案!

阅读(1692) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~