簡體   English   中英

`cat filename | grep -B 5 -C 5 foo`

[英]`cat filename | grep -B 5 -C 5 foo`

for filename in os.listdir("."):
    for line in open(filename).xreadlines():
        if "foo" in line:
            print line

所以這是一個簡單的python等同於cat filename | grep foo cat filename | grep foo 但是,我想要相當於cat filename | grep -B 5 -C 5 foo cat filename | grep -B 5 -C 5 foo ,如何修改上面的代碼?

最簡單的方法是:

for filename in os.listdir("."):
    lines = open(filename).readlines()
    for i, line in enumerate(lines):
        if "foo" in line:
            for x in lines[i-5 : i+6]:
                print x,

添加行號,塊之間的間隔等,以品嘗;-)。

在極不可能的情況下,你必須處理絕對令人發指的文本文件(比例如King James Bible大200-300倍,例如,整個文本文件約為4.3 MB),我推薦一個生成器產生滑動窗口(線的“FIFO”)。 只關注搜索行的簡單性,不包括文件的第一個和最后幾個(這需要一些特殊情況循環 - 這也是我返回索引的原因...因為它並不總是5 in那兩個額外的循環! - ):

import collections

def sliding_windows(it):
  fifo = collections.deque()
  # prime the FIFO with the first 10 
  for i, line in enumerate(it):
    fifo.append(line)
    if i == 9: break
  # keep yielding 11-line sliding-windows
  for line in it:
    fifo.append(line)
    yield fifo, 5
    fifo.popleft()

for w, i in sliding_windows(open(filename)):
  if "foo" in w[i]:
    for line in w: print line,

我想我會留下特殊情況循環(並且擔心很少行的文件;-)作為練習,因為無論如何整個事情都是如此令人難以置信的假設。

只是一些提示......:關閉的“特殊情況循環”非常簡單 - 只是反復刪除第一行,而不是附加,顯然,因為沒有什么可以附加...索引應該仍然是5,當你剛剛產生一個窗口,其中5是最后一個索引(即文件的最后一行)時,你就完成了; 起始情況有點微妙,因為在讀完前6行之前你不想屈服,此時索引將為0(文件的第一行)......

最后,為了額外的功勞,請考慮如何使這個工作在非常短的文件上! - )

雖然我喜歡Alex的答案的簡單性,但是在grepping大文件時需要大量內存。 這個算法怎么樣?

import os
for filename in (f for f in os.listdir(".") if os.path.isfile(f)):
    prevLines = []
    followCount = 0
    for line in open(filename):
        prevLines.append(line)
        if "foo" in line:
            if followCount <= 0:
                for prevLine in prevLines:
                    print prevLine.strip()  
            else:
                print line.strip()
            followCount = 5
        elif followCount > 0:
            print line.strip()
        followCount -= 1
        if len(prevLines) > 5:
            prevLines.pop(0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM