Python 连接和删除行
注意:解决方案必须是我可以嵌入python的东西 我有一个80多万行的文件。这些行被分组。每组行的开头以“IMAGE”开头,后面是一行以“HISTO”开头,然后是至少一行(但通常是多行)以“FRAG”开头 我需要:Python 连接和删除行,python,Python,注意:解决方案必须是我可以嵌入python的东西 我有一个80多万行的文件。这些行被分组。每组行的开头以“IMAGE”开头,后面是一行以“HISTO”开头,然后是至少一行(但通常是多行)以“FRAG”开头 我需要: 1.删除/放弃任何以“HISTO”开头的行。 2.对于每个“FRAG”行,我需要将其与前面的“IMAGE”行连接起来。 这里有一个例子 IMAGE ...data1... HISTO usually numbers 0 0 1 1 0 1 0 FRAG ...data1...
1.删除/放弃任何以“HISTO”开头的行。
2.对于每个“FRAG”行,我需要将其与前面的“IMAGE”行连接起来。 这里有一个例子
IMAGE ...data1...
HISTO usually numbers 0 0 1 1 0 1 0
FRAG ...data1...
FRAG ...data2...
IMAGE ...data2...
HISTO usually numbers 0 0 1 1 0 1 0
FRAG ...data1...
FRAG ...data2...
FRAG ...data3...
FRAG ...data4...
结果需要如下所示:
IMAGE ...data1... FRAG ...data1...
IMAGE ...data1... FRAG ...data2...
IMAGE ...data2... FRAG ...data1...
IMAGE ...data2... FRAG ...data2...
IMAGE ...data2... FRAG ...data3...
IMAGE ...data2... FRAG ...data4...
在使用图像线重新开始之前,可能会有许多碎片线
这是基于前面的一个问题,但现在我需要使用python来保持一致性。
这是我使用的代码,可以正常工作
> sed 's/>//' Input.txt|awk '/^IMAGE/{a=$0;next;} /^FRAG/{print ">"a,$0}'
之前的解决方案归功于AwkMan。Python解决方案
这将产生:
>IMAGE ...data1... FRAG ...data1...
>IMAGE ...data1... FRAG ...data2...
>IMAGE ...data2... FRAG ...data1...
>IMAGE ...data2... FRAG ...data2...
>IMAGE ...data2... FRAG ...data3...
>IMAGE ...data2... FRAG ...data4...
$ awk '/^>IMAGE/{img=$0;next} /^>HISTO/{next} {print img,substr($0,2)}' Input.txt
>IMAGE ...data1... FRAG ...data1...
>IMAGE ...data1... FRAG ...data2...
>IMAGE ...data2... FRAG ...data1...
>IMAGE ...data2... FRAG ...data2...
>IMAGE ...data2... FRAG ...data3...
>IMAGE ...data2... FRAG ...data4...
Awk解决方案
尝试:
例子
将其作为输入文件:
$ cat Input.txt
>IMAGE ...data1...
>HISTO usually numbers 0 0 1 1 0 1 0
>FRAG ...data1...
>FRAG ...data2...
>IMAGE ...data2...
>HISTO usually numbers 0 0 1 1 0 1 0
>FRAG ...data1...
>FRAG ...data2...
>FRAG ...data3...
>FRAG ...data4...
我们的代码生成:
>IMAGE ...data1... FRAG ...data1...
>IMAGE ...data1... FRAG ...data2...
>IMAGE ...data2... FRAG ...data1...
>IMAGE ...data2... FRAG ...data2...
>IMAGE ...data2... FRAG ...data3...
>IMAGE ...data2... FRAG ...data4...
$ awk '/^>IMAGE/{img=$0;next} /^>HISTO/{next} {print img,substr($0,2)}' Input.txt
>IMAGE ...data1... FRAG ...data1...
>IMAGE ...data1... FRAG ...data2...
>IMAGE ...data2... FRAG ...data1...
>IMAGE ...data2... FRAG ...data2...
>IMAGE ...data2... FRAG ...data3...
>IMAGE ...data2... FRAG ...data4...
工作原理
Awk隐式地逐行读取文件。我们将图像行保存在变量img
中,并在帧行出现时打印出来
更详细地说:
对于任何以/^>IMAGE/{img=$0;next}
开头的行,我们将该行保存在变量>IMAGE
中,然后跳过其余命令并跳转到img
下一行开始
对于任何以/^>HISTO/{next}
开头的行,我们跳过其余命令,跳转到>HISTO
下一行开始
对于所有其他行,我们打印打印img,substr($0,2)
,后跟当前行减去其第一个字符(即示例输入中的img
)
with open('in.txt', 'r') as fin, open('out.txt', 'w') as fout:
for line in fin:
if line.startswith('HISTO'):
continue
elif line.startswith('IMAGE'):
prefix = line.strip()
elif line.startswith('FRAG'):
fout.write(prefix + ' ' + line)
还可以考虑,当您已经有一个工作行命令(如“John1024”awk命令)时,您可以使用子流程执行它:
import subprocess
with open('input.txt', 'r') as fin, open('out.txt', 'w') as fout:
subprocess.run(["awk", "/^IMAGE/{img=$0;next} /^HISTO/{next} {print img,substr($0,1)}", "input.txt"], stdout=fout)
字符串切分、切分是你应该注意的事情,因为行实际上是以
开头的,或者这只是一个编辑工件?你试过写代码吗?那只是编辑。解决方案需要是python。底部提供的代码行工作得很好,但我现在需要用python来完成,以便可以将其添加到其他代码行中。@Wayne我一直在寻找,但不知道从何处开始。看起来像是字符串切片,我应该从拆分开始吗?约翰,谢谢,但根据问题,我需要一个python解决方案。@ChrisNull我应该仔细阅读。答案已用python解决方案更新。