Python 在赢得';t匹配模式

Python 在赢得';t匹配模式,python,regex,bash,awk,grep,Python,Regex,Bash,Awk,Grep,我有一个包含以下行的文件 4278.82888126 , 17 , 17 , 0 4289.29672647 , Marker 1 4478.07865548 , 18 , 18 , 0 5289.84818625 , 19 , 19 , 0 5377.07618618 , Marker 2 5505.54010463 , 20 , 20 , 0 5869.55748796 , 21 , 20 , 1 6057.54284048 , 22 , 20 , 2 6161.77394795 , 23

我有一个包含以下行的文件

4278.82888126 , 17 , 17 , 0
4289.29672647 , Marker 1
4478.07865548 , 18 , 18 , 0
5289.84818625 , 19 , 19 , 0
5377.07618618 , Marker 2
5505.54010463 , 20 , 20 , 0
5869.55748796 , 21 , 20 , 1
6057.54284048 , 22 , 20 , 2
6161.77394795 , 23 , 20 , 3
6455.30569553 , Marker 3
7594.11082244 , Marker 4
对于每个标记,我需要一条位于其正前方的有效线(不是标记线)。 我试过了

grep -B1 "Marker" file | grep -v Marker | grep -v '\-\-'
但这并不是每一个标记都能给我一条线。 这似乎是一个简单的一个,但我如何得到以下几行

 4278.82888126 , 17 , 17 , 0
 5289.84818625 , 19 , 19 , 0
 6161.77394795 , 23 , 20 , 3
 6161.77394795 , 23 , 20 , 3

只需将行存储在变量中,如果找到包含标记的行,则打印变量

$ awk '/Marker/ && line { print line; next } { line = $0 }' file
4278.82888126 , 17 , 17 , 0
5289.84818625 , 19 , 19 , 0
6161.77394795 , 23 , 20 , 3
6161.77394795 , 23 , 20 , 3
  • /Marker/&&line
    是一种操作,用于测试行是否包含
    标记
    ,以及是否设置了变量
    line
    。如果是,则打印变量
  • next
    允许我们移动到下一行,这样我们就不会在变量中存储包含
    标记的当前行
    
  • 对于所有不包含
    标记的行
    ,我们将保存在一个标量变量中,以便稍后打印
使用python,它很简单:

>>> import re
>>> f = open('ll.txt')
>>> prev = f.next().strip()
>>> for x in f:
...     if re.search('Marker',x) and not re.search('Marker',prev):
...         print prev
...     else: prev = x.strip()
... 
4278.82888126 , 17 , 17 , 0
5289.84818625 , 19 , 19 , 0
6161.77394795 , 23 , 20 , 3
6161.77394795 , 23 , 20 , 3

为什么这个标签是python?你在寻找python的解决方案吗?你能解释一下我们在plzThanks@Hackaholic上留下的评论吗。我补充了一些解释。如果您有什么特别需要我详细说明的,请告诉我。谢谢!很好用。如果我们有3行或更多行包含
标记