2013-04-10 44 views
0

我试图打印出文件夹下每个文件的第一行(以>开头,因为文件是fasta文件),并使用sed来提取出没有质粒和片段的那些行。如何匹配sed中没有某些字符串的行

我做了ls * | xargs -I one sed -n -e '/^>.*[^fragment|plasmid].*/p' one > outfile 但它不工作?我应该如何修改它?

+1

方括号永远不是正则表达式的正确分组操作符。 '[a | bc]'匹配'a','''','b'或'c'中的一个单个字符。在一些正则表达式中,'(a | bc)'匹配'a'或'bc',有些方言想把它作为'\(a \ | bc \)'。但是你不能在正则表达式中使用否定,除非在Perl兼容的正则表达式中,例如'>(?!。*(?: fragment | plasmid))。* $'。 – tripleee 2013-04-10 15:52:03

回答

1

这是否适合您?

head -q -n 1 * | egrep -v "^>.*(fragment|plasmid).*" 
+0

实际上你编辑之前的答案也适用,不知道你为什么修改它。仍然想知道sed是否可以管理这项工作。 – lolibility 2013-04-10 15:18:16

+1

@lolibility你为什么在乎sed是否可以做到这一点? sed是一个很好的工具,用于简单替换一行,但对于任何其他文本操作,您应该只使用awk。 20世纪70年代中期awk发明时,大多数seds语言结构已经过时。 – 2013-04-11 14:00:24

1

如果我读了开头>为打印线的要求,除非它们包含片段或质粒,那么我认为这会为你做它:

sed -ne '/^>/{/fragment/;b;/plasmid/b;p;}' one > outfile 

它会忽略不都行以>开始,如果它找到片段或质粒,则跳到脚本末尾并转到下一行。

2

我是否认为你只是想打印每一个文件的第一行,如果该行不包含片段或质粒?那只是:

awk 'FNR==1 && !/fragment|plasmid/' * 

如果这不是你想要的,用一些有代表性的样本输入和期望的输出来更新你的问题。

+0

您应该在第一行之后退出,否则您无缘无故地循环播放其余行。 – dogbane 2013-04-11 14:16:07

+1

就像在发布的sed解决方案中,对吗?如果我在第一行之后添加一个退出,那么脚本将只处理1个文件。在GNU awk中,你可以使用nextfile,但它是gawk特有的。您可以在循环或xargs中随时调用awk一个文件,然后使用您建议的退出,但是您将添加循环并处理开销,以便可能比今天更慢。实际上,仅仅使用脚本几乎肯定是绝对正确的,如果OP发现它确实需要加快速度,那么我们可以谈论各种解决方案的优缺点。 – 2013-04-11 14:49:17

相关问题