我想从我的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脚本的原因,因此对于解决方案的循环阶段的任何帮助都会很棒。
非常感谢
答案 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)
答案 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行并删除最后一个字符....