这个问题看起来很简单,也很常见,所以我查阅了很多答案,但似乎没有一个提供适当的一般解决方案。
我需要grep
大制表符分隔的6列文件(实际上是bed文件),以使用字符串变量(项)列表按第一列的内容进行拆分。我只需要一个以给定字符串开头的行。
我成功地利用了
grep -w "$name" inputfile
$name
从字符串列表中读取为此,直到字符串具有以下格式(示例):yal038w但也有yal038w-a、yal038w-b,…
因此,带有
grep
选项的-w
认为yal038w与yal038w-a、yal038w-b相同,因为“-
”是单词分隔符。它可以与“_
”一起工作,但不能与“-
”一起工作。我找到了基于
awk
的解决方案,这些方案运行良好,例如:awk -F $'\t' -vsearch=$name '$1==search' inputfile
但是
awk
非常慢,超过10倍,见下面的时间测量对于要查找的2.5 GB输入文件和>5000个项,脚本已经运行了>24小时!
输入文件示例:
YAL038W-A 0 48 HWI-1KL176:101:CC27NACXX:3:2208:17646:92047 0 +
YAL038W-A 0 48 HWI-1KL176:101:CC27NACXX:3:2211:17326:31268 0 +
YAL038W 1 50 HWI-1KL176:101:CC27NACXX:8:1205:16311:19319 3 +
YAL038W 1 27 HWI-1KL176:101:CC27NACXX:8:2103:4951:94527 42 +
time grep -w "YAL038W" inputfile > testfile.txt
real 0m3.569s
time awk -F $'\t' -vsearch="YAL038W" '$1==search' inputfile > testfile.txt
real 0m29.521s
我正在寻找使用
grep
或其他方法的快速解决方案,我需要在循环中将变量传递给此命令。另一种方法是用“
-
”替换“_
”来修改输入文件,但这是我认为的最后一种可能…提前谢谢
最佳答案
我找到了基于awk
的解决方案,这些方案运行良好,例如:
awk -F $'\t' -vsearch=$name '$1==search' inputfile
但是,
awk
非常慢……我正在寻找使用
grep
的快速解决方案…如果上面的
awk
命令对您有效,则可以执行以下操作:grep ^$name$'\t' inputfile
只需在每一行的开头搜索后面跟着一个制表符的名称。