使用awk去掉重复的单词

在水木社区的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 <your_file_name_here>

简单介绍一下上面的awk脚本:
awk处理文本的方式是逐行处理,因此,对于文件的每一行,都会执行上面的for循环。在执行for循环时,awk已经把这一行中所有以空格间隔的单词都分隔开了,并保存在诸如$1,$2这样的变量中。NF则是这一行中所包含的字段的数目,也就是单词的个数。
for循环的工作就是以该单词做为下标,计算文件中每个单词出现的次数。如果单词出现的次数为1,则输出此单词,否则不输出。这里用到了awk的关系数组。awk的数组与C语言不同,数组的下标不仅可以是数字,也可以是一个字符串,也就是说,诸如word[“hello”]这样的数组元素是允许的。上面的代码就是使用关系数组的一个例子。
在日常处理文本时,虽然VIM是最主要的文件编辑工具,但它并不是唯一可以高效完成工作的工具。在适当的时候,使用适当的工具,才是高效完成工作的最好方式。
生活不同于学校中的考试,所有的事情并不是仅有一个正确答案!

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/remove-duplicate-word-with-awk/

文章的脚注信息由WordPress的wp-posturl插件自动生成