2013-04-10 156 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

相關問題