Python或bash脚本:如果在两个相同标记之间的行中有图案,请删除行和第一个标记

时间:2018-06-20 21:02:06

标签: python bash design-patterns marker lines

作为初学者,我正在尝试解决以下问题(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

但是我很难理解如何在可以解决整个问题的函数中实现它。如果有人可以帮助我,那将让我感到非常高兴!

欢呼

1 个答案:

答案 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()