加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

大(27GB)文件的grep功能更快

发布时间:2020-12-13 19:48:01 所属栏目:Linux 来源:网络整理
导读:我必须从一个大文件(27GB)的文件(5MB)grep包含特定的字符串相同的字符串(和其他信息). 为了加快分析,我将27GB文件分解成1GB文件,然后应用以下脚本(在这里的一些人的帮助下).但是它不是很有效(生成一个180KB的文件需要30个小时!). 这是脚本.有没有比grep更合
我必须从一个大文件(27GB)的文件(5MB)grep包含特定的字符串相同的字符串(和其他信息).
为了加快分析,我将27GB文件分解成1GB文件,然后应用以下脚本(在这里的一些人的帮助下).但是它不是很有效(生成一个180KB的文件需要30个小时!).

这是脚本.有没有比grep更合适的工具?还是使用grep更有效的方式?

#!/bin/bash

NR_CPUS=4
count=0


for z in `echo {a..z}` ;
do
 for x in `echo {a..z}` ;
 do
  for y in `echo {a..z}` ;
  do
   for ids in $(cat input.sam|awk '{print $1}');  
   do 
    grep $ids sample_"$z""$x""$y"|awk '{print $1" "$10" "$11}' >> output.txt &
    let count+=1
                                [[ $((count%NR_CPUS)) -eq 0 ]] && wait
   done
  done #&

解决方法

你可以尝试几件事:

1)你正在读取input.sam多次.它只需要在你的第一个循环开始之前被读取一次.将这个id保存到一个临时文件中,这个文件将被grep读取.

2)使用LC_ALL = C将您的grep命令前缀使用C语言环境而不是UTF-8.这样会加快grep.

3)使用fgrep,因为您正在搜索固定的字符串,而不是正则表达式.

4)使用-f使grep从文件中读取模式,而不是使用循环.

5)不要从多个进程写入输出文件,因为可能会导致行交错和损坏的文件.

进行这些更改后,您的脚本将成为:

awk '{print $1}' input.sam > idsFile.txt
for z in {a..z}
do
 for x in {a..z}
 do
  for y in {a..z}
  do
    LC_ALL=C fgrep -f idsFile.txt sample_"$z""$x""$y" | awk '{print $1,$10,$11}'
  done >> output.txt

另外,查看GNU Parallel是为了帮助您并行运行作业而设计的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读