linux - 如何使用 sed 或 Perl 删除多行 block 中的部分行?

标签 linux perl unix sed

我有一些看起来像这样的数据。它有四个大块。每个 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/

相关文章:

linux - 我使用哪个命令来查找从特定目录开始的特定文件?

c++ - 最优锁文件方法

linux - 应该使用哪个 shell 以获得 Linux/MacOS/UNIX 最佳兼容性?

linux - 如何将/dev/sda 与/dev/sdb 交换?

linux - 如何从每个具有匹配文本的文件中删除行?

perl - 如何确定脚本是在系统中执行还是在 Perl 中的 qx 调用中执行?

mysql - Perl MySQL - 如果特定字段匹配,如何跳过更新或插入行?

linux - 使用 Nginx 在 Debian 服务器上部署 Laravel 项目

python - 尝试在需要它的 python 脚本中定义 DJANGO_SETTINGS_MODULE 时出现错误

perl - 在Perl中,如何将多个软件包放在单个.pm文件中?