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,它旨在帮助您并行运行作业.