python - 删除以 @ 开头的每行的最后一个字符

标签 python bash awk sed

我想从我的 300 多个文件中删除以 @ 开头的每一行的最后一个字符,每个文件大约 1GB。

我的示例文件如下:

@1_1101_1473_2134_1
CATGCGGGAGGAGGAGGACGAGGACCTGCTGCAGTTTGCCATCCAGCAGAGTCTCCTGGAGGTGGGGGCCGAGTACGACCAGGTAACACCCC
+
FFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBBFFFFF<FFFFFF/BFBF7FFBFFFFFFFFFFBFFFFFF
@1_1101_1635_2243_1
CATGCACACCTCCCGGTCTCCGTTGTGGAGGATCAGGTCCACGATCTCCTGGGTCCACGTGGTGCCTACACACACACACACACACACACACA
+
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

我想从以 @ 开头的行中删除最后一个字符 1,所以我的输出应该是

@1_1101_1473_2134_
CATGCGGGAGGAGGAGGACGAGGACCTGCTGCAGTTTGCCATCCAGCAGAGTCTCCTGGAGGTGGGGGCCGAGTACGACCAGGTAACACCCC
+
FFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBBFFFFF<FFFFFF/BFBF7FFBFFFFFFFFFFBFFFFFF
@1_1101_1635_2243_
CATGCACACCTCCCGGTCTCCGTTGTGGAGGATCAGGTCCACGATCTCCTGGGTCCACGTGGTGCCTACACACACACACACACACACACACA
+
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

我首先尝试了 python,它适用于这些行,但作为新手,我不知道如何保留输出中的所有行。

with open("file.fq") as f:
        for line in f:
                length=(len(line)-2)
                if line.startswith('@'):
                        line=line[:length]+''+line[length+1:]
                        print(line)

这当然只给出了“线条”,但我想展示它的工作原理

@1_1101_1473_2134_

@1_1101_1635_2243_

然后我尝试了 awk 和 sed。我可以使用 awk 选择以 @ 开头的行,如下所示:

awk '{if (/^@/)}'

我可以使用 sed 删除每行的最后一个字符:

sed {'s/.$//'}

所以我当然尝试将这两者结合起来,简单地如下:

awk '{if (/^@/)}' | sed {'s/.$//'} file.fq

这不起作用。

顺便说一句,如果可能的话,我更愿意直接从我的文件中删除这些字符,而不是创建一个删除这些字符的新文件,因为我有超过 300GB 的数据,当然我更喜欢一种快速的方法。

非常感谢任何升级我的命令的帮助,或者以任何其他方式执行此操作的任何替代方法。另外,我希望在循环中为所有文件运行正确的命令,这就是我首先尝试生成 python 脚本的原因,因此有关解决方案的循环阶段的任何帮助也会很棒。

非常感谢

最佳答案

$ sed -i '/^@/ s/.$//' file.fq
$ cat file.fq
@1_1101_1473_2134_
CATGCGGGAGGAGGAGGACGAGGACCTGCTGCAGTTTGCCATCCAGCAGAGTCTCCTGGAGGTGGGGGCCGAGTACGACCAGGTAACACCCC
+
FFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBBFFFFF<FFFFFF/BFBF7FFBFFFFFFFFFFBFFFFFF
@1_1101_1635_2243_
CATGCACACCTCCCGGTCTCCGTTGTGGAGGATCAGGTCCACGATCTCCTGGGTCCACGTGGTGCCTACACACACACACACACACACACACA
+
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  • /^@/ 匹配以 @ 开头的行
  • s/.$//删除该行的最后一个字符
  • -i 就地编辑,不同 sed 版本的 -i 选项的用法有所不同,请参阅语法文档


使用python

import fileinput

with fileinput.input(inplace=True) as f:
    for line in f:
        line = line.rstrip('\n');

        if line.startswith('@'):
            line = line[:-1]

        print(line)
  • 这将接受文件作为命令行参数,因此您可以执行类似 ./del_last.py *.fq
  • 的操作
  • 另请参阅 Python's slice notation

关于python - 删除以 @ 开头的每行的最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40451238/

相关文章:

python - “gcc”在尝试安装 gevent-websocket 时失败,退出状态为 1

bash - 编译Blender BPY : recompile with -fPIC?

linux - bash 脚本中 Grep 命令的问题

awk - 如何在 bash 中 AWK 多列

linux - 从一个位置开始将一个长字符串包装成多行

python - 使用 xarray 加入/合并多个 NetCDF 文件

python - 我的 PySide2 脚本中的语法错误从何而来?

python - 动态创建子类的类型注解

linux - 如何以特定方式重命名目录。巴什

regex - 重命名多个文件,按 '_' 拆分文件名并保留第一个和最后一个字段