[英]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.