在模式之前获得不匹配模式的行

时间:2014-12-07 17:01:20

标签: 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 , 20 , 3
6455.30569553 , Marker 3
7594.11082244 , Marker 4

对于每个Marker,我需要一个在它之前的有效行(不是Marker行)。 我试过

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

2 个答案:

答案 0 :(得分:6)

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

$ 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是一项操作,用于测试该行是否包含Marker以及是否设置了变量line。如果是,则打印变量。
  • next允许我们移动到下一行,因此我们最终不会在变量中存储包含Marker的当前行。
  • 对于不包含Marker的所有行,我们将一直存储在标量变量中,以便稍后打印。

答案 1 :(得分:0)

使用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