我试图打印出文件夹下每个文件的第一行(以>开头,因为文件是fasta文件),并使用sed来提取出没有质粒和片段的那些行。如何匹配sed中没有某些字符串的行
我做了ls * | xargs -I one sed -n -e '/^>.*[^fragment|plasmid].*/p' one > outfile
但它不工作?我应该如何修改它?
我试图打印出文件夹下每个文件的第一行(以>开头,因为文件是fasta文件),并使用sed来提取出没有质粒和片段的那些行。如何匹配sed中没有某些字符串的行
我做了ls * | xargs -I one sed -n -e '/^>.*[^fragment|plasmid].*/p' one > outfile
但它不工作?我应该如何修改它?
这是否适合您?
head -q -n 1 * | egrep -v "^>.*(fragment|plasmid).*"
实际上你编辑之前的答案也适用,不知道你为什么修改它。仍然想知道sed是否可以管理这项工作。 – lolibility 2013-04-10 15:18:16
@lolibility你为什么在乎sed是否可以做到这一点? sed是一个很好的工具,用于简单替换一行,但对于任何其他文本操作,您应该只使用awk。 20世纪70年代中期awk发明时,大多数seds语言结构已经过时。 – 2013-04-11 14:00:24
如果我读了开头>为打印线的要求,除非它们包含片段或质粒,那么我认为这会为你做它:
sed -ne '/^>/{/fragment/;b;/plasmid/b;p;}' one > outfile
它会忽略不都行以>开始,如果它找到片段或质粒,则跳到脚本末尾并转到下一行。
我是否认为你只是想打印每一个文件的第一行,如果该行不包含片段或质粒?那只是:
awk 'FNR==1 && !/fragment|plasmid/' *
如果这不是你想要的,用一些有代表性的样本输入和期望的输出来更新你的问题。
您应该在第一行之后退出,否则您无缘无故地循环播放其余行。 – dogbane 2013-04-11 14:16:07
就像在发布的sed解决方案中,对吗?如果我在第一行之后添加一个退出,那么脚本将只处理1个文件。在GNU awk中,你可以使用nextfile,但它是gawk特有的。您可以在循环或xargs中随时调用awk一个文件,然后使用您建议的退出,但是您将添加循环并处理开销,以便可能比今天更慢。实际上,仅仅使用脚本几乎肯定是绝对正确的,如果OP发现它确实需要加快速度,那么我们可以谈论各种解决方案的优缺点。 – 2013-04-11 14:49:17
方括号永远不是正则表达式的正确分组操作符。 '[a | bc]'匹配'a','''','b'或'c'中的一个单个字符。在一些正则表达式中,'(a | bc)'匹配'a'或'bc',有些方言想把它作为'\(a \ | bc \)'。但是你不能在正则表达式中使用否定,除非在Perl兼容的正则表达式中,例如'>(?!。*(?: fragment | plasmid))。* $'。 – tripleee 2013-04-10 15:52:03