【问题标题】:Get the line before pattern that won't match pattern获取与模式不匹配的模式之前的行
【发布时间】:2015-02-05 08:28:22
【问题描述】:

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

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

【问题讨论】:

  • 为什么这个标签是python?您是否正在寻找 Python 中的解决方案?

标签: python regex bash awk grep


【解决方案1】:

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

$ 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 的行,我们将继续存储在一个标量变量中,以便稍后打印。

【讨论】:

  • 你能给我们解释一下吗
  • 感谢@Hackaholic 发表评论。我已经添加了一些解释。如果有什么特别需要我详细说明的,请告诉我。
  • 谢谢!完美运行。
【解决方案2】:

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

【讨论】:

  • 如果我们有 3 行或更多行包含 Marker 怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
相关资源
最近更新 更多