注意:解决方案需要是我可以嵌入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以前的解决方案。
答案 0 :(得分:1)
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 '/^>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();