这个问题看起来很简单,也很常见,所以我查阅了很多答案,但似乎没有一个提供适当的一般解决方案。
我需要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

只需在每一行的开头搜索后面跟着一个制表符的名称。

07-24 21:19