使grep带有和不带有破折号“-”的精确匹配字符串

时间:2019-05-22 12:13:56

标签: linux awk grep

这个问题看起来很简单而且很常见,因此我浏览了许多答案,但似乎没有一个提供适当的一般解决方案。 我需要grep大的制表符分隔的6列文件(实际上是* .bed文件),以使用字符串变量(项目)列表按第一列的内容进行拆分。我只需要从给定的字符串开始的一行。

我成功使用了

grep -w "$name" inputfile     
从字符串列表中读取

$name 为此,直到字符串具有以下格式(示例): YAL038W ,还有 YAL038W-A YAL038W-B 。 。 因此,带有grep选项的-w认为 YAL038W YAL038W-A YAL038W-B 相同,因为“ {{ 1}}“是单词分隔符。它将与“ -”一起使用,而不与“ _”一起使用。

我发现基于-的解决方案效果很好,例如:

awk

但是awk -F $'\t' -vsearch=$name '$1==search' inputfile 的速度非常慢,超过10倍,请参见下面的时间测量 对于2.5 Gb输入文件和要查找的5000多个项目,脚本已经运行了24小时以上!

输入文件示例:

awk
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 或其他东西的FAST解决方案,并且需要在循环中将变量传递给此命令。 另一种方法是通过将“ grep”替换为“ -”来修改输入文件,但这是我相信的最后一种可能性... 预先感谢

1 个答案:

答案 0 :(得分:0)

  

我发现基于awk的解决方案效果很好,例如:

awk -F $'\t' -vsearch=$name '$1==search' inputfile
     

但是awk的运行速度非常慢……   

我正在寻找使用grep的FAST解决方案……

如果上面的awk命令对您有用,那么它将起作用:

grep ^$name$'\t' inputfile

只需在每行的开头搜索名称,后跟TAB。

相关问题