2014-12-07 51 views
3

我有以下行獲取模式前行,將不會匹配pattern

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 
+0

這是爲什麼標籤蟒蛇?你在尋找一個解決方案在Python中? – Korem 2014-12-07 17:04:36

回答

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的行,我們將繼續存儲在一個標量變量中以便稍後打印。
+0

你能解釋我們嗎plz – Hackaholic 2014-12-07 17:12:21

+0

謝謝@Hackaholic發表評論。我已經添加了一些解釋。請讓我知道,如果有什麼特別的,你想我詳細說明。 – 2014-12-07 17:15:53

+1

謝謝!完美的作品。 – reencode 2014-12-07 17:37:26

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 
+0

如果我們有3個或更多包含'Marker'的行,那麼怎麼辦? – Kasramvd 2014-12-07 17:39:18

+0

@Kasra檢查它,這段代碼將起作用 – Hackaholic 2014-12-07 18:02:56