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是最主要的文件编辑工具,但它并不是唯一可以高效完成工作的工具。在适当的时候,使用适当的工具,才是高效完成工作的最好方式。
生活不同于学校中的考试,所有的事情并不是仅有一个正确答案!