文本文件提取重复内容的 N 种方法

作者: Ginson 分类: Linux 发布时间: 2016-08-10 13:09

最近利用shell帮公司优化挖掘关键词的流程,用 shell 替代了多个环节的操作,极大提高了工作效率。

shell 在文本处理上确有极大优势,除 awk、grep、sed 三剑客之外,还有很多对文本处理很有帮助的命令。

最近在进行『文本文件提取重复内容』时,就极大体会到了 shell 命令的灵活性。

 

例子:

有文件 A.txt 和 B.txt,其中 A 为关键词和搜索量,以逗号分隔,约 90 万行,B 为关键词,约 400 万行,需要从 A 中找出与 B 重复的关键词。

 

方法一:

awk -F, '{print $1}' A >keywords.txt
cat keywords.txt B.txt | sort | uniq -d

先从 A.txt 中取出关键词,然后与 B.txt 一起打开,用 sort 命令排序,再用 uniq -d 取出重复的行

 
方法二:

awk -F, '{print $1}' A >keywords.txt
comm -1 -2 keywords.txt B.txt

取出关键词,利用 comm 命令,显示两个文件都存在的行(用 comm 命令前可能需要先对文件内容用 sort 命令进行排序)

 
方法三:

awk -F, '{print $1}' A >keywords.txt
for i in `cat keywords.txt`
do
    A=`egrep -c "^$i$" B.txt`
    if [ $A != 0 ]
    then
        echo $i >>重复关键词.txt
    fi
done

首先取出关键词,然后利用 for 循环逐个去 B.txt 里面匹配(注意正则写法 ^$i$),如果匹配到的结果数不为 0,说明这个关键词是重复的,然后输出

 
方法四:

awk -F, '{print $1}' A >keywords.txt
cat keywords.txt B.txt | awk '!a[$1]++'

 
这个方法的原理其实我不太懂,awk命令实在太强大太高深了,但是这种方法又简洁又快速
还有一种grep -v 、grep -f 的方法,但是我没有试过。以上列出的方法希望对大家有帮助。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注