加入和删除行

时间:2016-08-03 01:33:23

标签: python

注意:解决方案需要是我可以嵌入python的东西。

我有一个包含800,000多行的文件。线条分组。每组行的开头以" 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...  

在使用IMAGE线重新开始之前,可以有许多FRAG线。

这基于前一个问题,但现在我需要使用python来保持一致性。 这是我正在使用的代码。

> sed 's/>//' Input.txt|awk '/^IMAGE/{a=$0;next;} /^FRAG/{print ">"a,$0}'

感谢AwkMan以前的解决方案。

2 个答案:

答案 0 :(得分:1)

Python解决方案

with open('Input.txt') as f:
    for line in f:
        line = line.rstrip()
        if line.startswith('>IMAGE'):
            img = line
            continue
        if line.startswith('>HIST'):
            continue
        print('%s %s' % (img, line.lstrip('>')))

这会产生:

>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解决方案

尝试:

awk '/^>IMAGE/{img=$0;next} /^>HISTO/{next} {print img,substr($0,2)}' Input.txt

实施例

将此作为输入文件:

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

我们的代码产生:

$ 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隐式地逐行读取文件。我们将IMAGE行保存在变量img中,并在出现FRAG行时打印出来。

更详细:

  • /^>IMAGE/{img=$0;next}

    对于以>IMAGE开头的任何行,我们将该行保存在变量img中,然后跳过其余命令并跳转到next行重新开始。< / p>

  • /^>HISTO/{next}

    对于以>HISTO开头的任何行,我们会跳过其余命令并跳转到next行重新开始。

  • print img,substr($0,2)

    对于所有其他行,我们打印img后跟当前行减去其第一个字符(样本输入中为>)。

答案 1 :(得分:0)

试试这个解决方案:

XDocument doc = XDocument.Load(filepath);

var elements  = doc
        .Descendants("OTPCDATA")                       //flatten your hierarchy
        .Where(x=>(string)x.Element("STATUS") =="0")   // filter those elements whose nested status is  "0".
        .Select(x=>x.Element("STATUS"));               // Select those elements.

还要考虑当你有一个已经在线的命令时,比如&#34; John1024&#34; awk命令,您可以使用子进程执行它:

// Now update element value
foreach(var element in elements)
{
    // your logic.
    element.Value = "1";
}

doc.Save();