shell两个文件去重的多种姿势

 更新时间:2016年12月19日 14:14:07   作者:林间  
最近在利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率。下面这篇文章就给大家分享了利用shell实现两个文件去重的多种姿势,有需要的朋友们可以参考借鉴,下面来一起看看吧。

前言

大家都知道shell在文本处理上确有极大优势,比如多文本合并、去重等,但是最近遇到了一个难搞的问题,即两个大数据量文件去重。下面来看看详细的介绍吧。

要求 

有txt文件A.txt和B.txt。

其中A为关键词和搜索量,以逗号分隔,约90万行。

B为关键词,约400万行。

需要从A中找出与B重复的关键词。

我试了N种姿势,但结果都不尽人意,最奇怪的是有些方法对小数据量的测试文件有用,一旦用在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命令,显示两个文件都存在的行

姿势三:

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,说明这个关键词是重复的,然后输出
#这种方法的优点是稳妥,缺点是效率太TM低了,90万个词逐一与400万词匹配,shell默认又没有多线程,耗时太长。

姿势四:

awk -F, '{print $1}' A >keywords.txt
cat keywords.txt B.txt | awk '!a[$1]++'
 
#这个方法的原理其实我不太懂,awk命令实在太强大太高深了,但是这种方法又简洁又快速

其实还有一种grep -vgrep -f 的方法,但是我没有试过,所以不在这里列出了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

  • Shell中echo命令及编程规范

    Shell中echo命令及编程规范

    本文主要介绍了Shell中echo命令及编程规范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • linux shell流程控制语句实例讲解(if、for、while、case语句实例)

    linux shell流程控制语句实例讲解(if、for、while、case语句实例)

    linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。下面我将通过例子介绍下,各个语句使用方法
    2014-04-04
  • 如何短时间内学好一门语言 shell脚本语言为例

    如何短时间内学好一门语言 shell脚本语言为例

    这篇文章主要以shell脚本语言为例,为大家介绍了如何短时间内学好一门语言,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Linux启动新进程的几种方法及比较

    Linux启动新进程的几种方法及比较

    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。
    2017-04-04
  • Linux Shell脚本中如何获取命令运行的结果

    Linux Shell脚本中如何获取命令运行的结果

    脚本中常常要获取一些命令的执行结果,比如当前目录pwd、当前时间date等等,下面这篇文章主要给大家介绍了关于Linux Shell脚本中如何获取命令运行的结果,需要的朋友可以参考下
    2023-06-06
  • shell脚本declare命令的用法详解(声明变量的属性和类型)

    shell脚本declare命令的用法详解(声明变量的属性和类型)

    这篇文章主要介绍了shell脚本declare命令用法(声明变量的属性和类型,declare 命令在一般的脚本编写中并不常用,大多数情况下直接使用简单的变量赋值语句即可满足需求,需要的朋友可以参考下
    2023-06-06
  • shell中exit 0和exit 1的区别有哪些

    shell中exit 0和exit 1的区别有哪些

    exit1和exit是shell中的两个命令,用于退出当前的shell进程,本文就来介绍一下shell中exit 0和exit 1有哪些区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • shell脚本实现Hbase服务的监控报警和自动拉起问题

    shell脚本实现Hbase服务的监控报警和自动拉起问题

    这篇文章主要介绍了shell脚本实现Hbase服务的监控报警和自动拉起,主要是通过服务名监控和端口监控,通过企业微信消息通知脚本,对此内容感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • 使用Linux的alternatives命令替换选择软件的版本方法

    使用Linux的alternatives命令替换选择软件的版本方法

    下面小编就为大家带来一篇使用Linux的alternatives命令替换选择软件的版本方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 监控服务器swap并重启php的Shell脚本

    监控服务器swap并重启php的Shell脚本

    有一台服务器老是交换扇区占满然后失去响应,很烦,因为加载了以前别人写的一个php扩展,效率低,资源占用大,悲剧的是现在还没有可以替换的东西
    2014-03-03

最新评论