我有一些看起来像这样的数据。它有四个大块。每个 block 都以 @
字符开头。
@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
在每个 block 的第三行,我想删除 +
字符之后的文本,导致:
@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 中是否有一种紧凑的方法来做到这一点?
最佳答案
假设您只是不想盲目地删除以 +
开头的 every 行的其余部分,那么您可以这样做:
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
关于linux - 如何使用 sed 或 Perl 删除多行 block 中的部分行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4813353/