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

时间:2016-11-06 15:46:51

标签: 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脚本的原因,因此对于解决方案的循环阶段的任何帮助都会很棒。

非常感谢

4 个答案:

答案 0 :(得分:4)

WeakReference
  • $ 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
  • 这将接受文件作为命令行参数,因此您可以执行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)
  • 之类的操作
  • 另见Python's slice notation

答案 1 :(得分:0)

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

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

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

import re
pattern = '^(@.*?)\S\r?\n'
rex = re.compile(pattern, flags = re.MULTILINE)
with open("file.fq") as f:
    data = f.read()
new = rex.sub(r'\1\n', data)

答案 2 :(得分:0)

这应该有效:

sed 's/\(^@.*\)./\1/' <file>

答案 3 :(得分:-1)

从第一个@到下一个@。他们的行号是否相等?整个文件是4?

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

如果是这样的话。它可能对你有所帮助。首先找到@然后删除第4行的最后一个字符。然后从这一行(4)找到下一个@然后+4行并删除最后一个字符....