更快的grep函数适用于大(27GB)文件

fab*_*n79 9 bash awk grep file

我必须从包含特定字符串的文件(5MB)中获取大文件(27GB)中相同的字符串(和其他信息).为了加快分析速度,我将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 #&
Run Code Online (Sandbox Code Playgroud)

dog*_*ane 14

你可以尝试一些事情:

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

2)LC_ALL=C使用C语言环境而不是UTF-8 前缀grep命令.这会加快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
Run Code Online (Sandbox Code Playgroud)

另外,请查看GNU Parallel,它旨在帮助您并行运行作业.

  • 有用!!!!!!!!现在需要几秒钟而不是几天!我该怎么说谢谢你??!?!? (2认同)