我想从我的 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/