【发布时间】:2016-11-06 15:46:51
【问题描述】:
我想从我的 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 脚本,所以任何关于你的解决方案的循环阶段的帮助也会很棒。
非常感谢
【问题讨论】:
-
您在 Python 中的唯一错误是将
print()缩进成为if语句的一部分。 取消缩进该行与for循环中的其余代码处于同一级别。 -
除非您使用
ed,否则您无法在不创建新文件的情况下执行此操作,即使那样您也将使用文件大小的缓冲区,因此不会有任何区别。 sed -i 等都在运行中创建 tmp 文件。 -
如果某个答案解决了您的问题,请通过单击旁边的大复选标记 (✓) 接受它,并可选择对其进行投票(投票至少需要 15 个声望点)。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请参阅the relevant help-center article。如果您的问题尚未完全得到解答,请提供反馈。如果您认为自己找到了最佳解决方案,请将其发布为答案并自我接受。