Python 连接和删除行

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...

注意:解决方案必须是我可以嵌入python的东西

我有一个80多万行的文件。这些行被分组。每组行的开头以“IMAGE”开头,后面是一行以“HISTO”开头,然后是至少一行(但通常是多行)以“FRAG”开头

我需要:
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解决方案更新。