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

2024-10-01 07:26:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的示例文件如下:

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

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

^{pr2}$

我第一次尝试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。我可以选择以@using awk开头的行,如下所示:

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

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

sed {'s/.$//'}

所以我试着把这两者结合起来,简单地说:

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

这不起作用。在

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

任何帮助升级我的命令,或任何其他方式做这件事的任何其他方式都是高度赞赏的。另外,我希望在循环中对所有文件运行正确的命令,这就是为什么我第一次尝试生成一个python脚本,所以任何关于loop stage的帮助对于您的解决方案也是非常有用的。在

非常感谢


Tags: 文件命令示例if方式line字符length
3条回答

这应该是有效的:

sed 's/\(^@.*\)./\1/' <file>
$ sed -i '/^@/ s/.$//' file.fq
$ cat file.fq
@1_1101_1473_2134_
CATGCGGGAGGAGGAGGACGAGGACCTGCTGCAGTTTGCCATCCAGCAGAGTCTCCTGGAGGTGGGGGCCGAGTACGACCAGGTAACACCCC
+
FFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBBFFFFF<FFFFFF/BFBF7FFBFFFFFFFFFFBFFFFFF
@1_1101_1635_2243_
CATGCACACCTCCCGGTCTCCGTTGTGGAGGATCAGGTCCACGATCTCCTGGGTCCACGTGGTGCCTACACACACACACACACACACACACA
+
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  • /^@/匹配以@开头的行
  • s/.$//删除这些行的最后一个字符
  • -i就地编辑,-i选项的用法因sed版本而异,语法请参阅文档


使用python

^{pr2}$
  • 这将接受文件作为命令行参数,因此您可以执行类似./del_last.py *.fq
  • 另请参见Python's slice notation

对于Python脚本,只需从条件套件中取出print语句:

with open("file.fq") as f:
    for line in f:
        if line.startswith('@'):
            line = line[:-2] + '\n'
        print(line, end = '')

如果你有足够的内存来保存一个完整的文件和一个副本,你可以使用一个正则表达式立即对整个文件进行更改。在

^{pr2}$

相关问题 更多 >