簡體   English   中英

如何使用sed或Perl刪除多行塊中的部分行?

[英]How do I remove part of a line in a multi-line chunk using sed or Perl?

我有一些看起來像這樣的數據。 它有四個塊。 每個塊都以@字符開頭。

@SRR037212.1 FC30L5TAA_102708:7:1:741:1355 length=27
AAAAAAAAAAAAAAAAAAAAAAAAAAA
+SRR037212.1 FC30L5TAA_102708:7:1:741:1355 length=27
::::::::::::::::::::::::;;8
@SRR037212.2 FC30L5TAA_102708:7:1:1045:1765 length=27
TATAACCAGAAAGTTACAAGTAAACAC
+SRR037212.2 FC30L5TAA_102708:7:1:1045:1765 length=27
888888888888888888888888888

在每個塊的第三行,我想刪除+字符后面的文本,導致:

@SRR037212.1 FC30L5TAA_102708:7:1:741:1355 length=27
AAAAAAAAAAAAAAAAAAAAAAAAAAA
+
::::::::::::::::::::::::;;8
@SRR037212.2 FC30L5TAA_102708:7:1:1045:1765 length=27
TATAACCAGAAAGTTACAAGTAAACAC
+
888888888888888888888888888

在sed或Perl中有一個緊湊的方法嗎?

假設你只是不想盲目地刪除以+開頭的每一行的其余部分,那么你可以這樣做:

sed '/^@/{N;N;s/\n+.*/\n+/}' infile

產量

$ sed '/^@/{N;N;s/\n+.*/\n+/}' infile
@SRR037212.1 FC30L5TAA_102708:7:1:741:1355 length=27
AAAAAAAAAAAAAAAAAAAAAAAAAAA
+
::::::::::::::::::::::::;;8
@SRR037212.2 FC30L5TAA_102708:7:1:1045:1765 length=27
TATAACCAGAAAGTTACAAGTAAACAC
+
888888888888888888888888888
+Dont remove me

*注:雖然在上面的命令鍵@ ,以確定是否有一個線+應該改變,它仍然改變二號線如果碰巧也有啟動+ 這聽起來並非如此,但如果你想排除這個角落的情況,下面的小改動將防止這種情況:

sed '/^@/{N;N;s/\(.*\)\n+.*/\1\n+/}' infile

產量

$ sed '/^@/{N;N;s/\(.*\)\n+.*/\1\n+/}' ./infile
@SRR037212.1 FC30L5TAA_102708:7:1:741:1355 length=27
+AAAAAAAAAAAAAAAAAAAAAAAAAAA
+
::::::::::::::::::::::::;;8
@SRR037212.2 FC30L5TAA_102708:7:1:1045:1765 length=27
TATAACCAGAAAGTTACAAGTAAACAC
+
888888888888888888888888888
+Dont remove me

如果第一行或第二行上永遠不會有+,而第三行總是一行:

perl -0100pi -e's/\+.*/+/' datafile

除此以外:

perl -0100pi -e's/^((?:.*\n){2}.*?\+).*/$1/' datafile

或者在5.10+上:

perl -0100pi -e's/^(?:.*\n){2}.*?\+\K.*//' datafile

所有那些假設@只出現在一個塊的開頭。 如果它可能出現在其他地方,那么:

perl -pi -e's/\+.*/+/ if $. % 4 == 3' datafile

如果你可以使用awk,你可以這樣做:

 gawk '{if ($0 ~ /^@/ ) { print ; getline ; print ; getline ; print "+"}}' INPUTFILE

因此,如果gawk在行的開頭看到一個@ ,它將被打印,然后下一行將被打印&&打印,最后啜飲第3行(在@ ),並僅打印+

如果+不在行的開頭,則可以使用gensub(/\\+.*/,"+",$0)而不是最后一次print中的"+"

(如果你安裝了perl ,很可能會有一個a2p可執行文件,可以將上面的awk腳本轉換為perl,如果你想......)

HTH

更新 (缺少第4行):

 gawk '{if ($0 ~ /^@/ ) { print ; getline ; print ; getline ; print "+"; getline; print }}' INPUTFILE

這也應該打印第4行。

也許只是sed '/^@/+2 s/+.*/+/'

編輯 :這將無法正常工作,但作為vim命令,它應該工作:

vim file -c ':g/^@/+2s/+.*/+/' -c 'wq'

這可能對你有用:

sed '/^@/{$!N;$!N;$!N;s/\n+[^\n]*/\n+/g}' file

或者使用GNU sed:

sed '/^@/,+3s/^+.*/+/' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM