作为初学者,我正在尝试解决以下问题(bash或python脚本):
文件(〜50G!)
marker
xxx
xxx
xxx
pattern
marker
xxx
xxx
xxx
marker
xxx
xxx
xxx
pattern
我想找到一种方法来删除两个markers
+第一个marker
之间的行,但是如果marker
不能,则不能删除最后一次出现的pattern
整行都可以找到。
想要的结果:
marker
xxx
xxx
xxx
pattern
[empty!]
marker
xxx
xxx
xxx
pattern
我试图用正则表达式或awk解决它(这是一个非常害羞的开始)
awk '/marker/{f=1} f; /marker/{f=1}' file
但是我很难理解如何在可以解决整个问题的函数中实现它。如果有人可以帮助我,那将让我感到非常高兴!
欢呼
答案 0 :(得分:0)
这是在python中执行此操作的一种方法。将marker
视为分隔符,然后从文本片段中删除所有不包含pattern
f = open('markerfile.txt','r')
lines = f.read().split('marker\n')
lines = [entry for entry in lines if 'pattern' in entry or not entry]
print 'marker\n'.join(lines)
编辑:列表理解中的or not entry
位只处理marker
是文件的第一行的情况。
编辑2:这是流式版本(更适合大文件。)它使用islice
中的itertools
一次获取文件的n
行。该算法的其余部分大致相同。
from itertools import islice
f = open('markerfile.txt','r')
fout = open('markersout.txt','w')
n=5
while True:
next_n_lines = ''.join(list(islice(f, n)))
if not next_n_lines:
break
lines = next_n_lines.split('marker\n')
lines = [entry for entry in lines if 'pattern' in entry or not entry]
print >> fout, 'marker\n'.join(lines).strip()
f.close()
fout.close()