这个问题看起来很简单而且很常见,因此我浏览了许多答案,但似乎没有一个提供适当的一般解决方案。
我需要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
”替换为“ -
”来修改输入文件,但这是我相信的最后一种可能性...
预先感谢
答案 0 :(得分:0)
我发现基于
awk
的解决方案效果很好,例如:awk -F $'\t' -vsearch=$name '$1==search' inputfile
但是
awk
的运行速度非常慢……我正在寻找使用
grep
的FAST解决方案……
如果上面的awk
命令对您有用,那么它将起作用:
grep ^$name$'\t' inputfile
只需在每行的开头搜索名称,后跟TAB。