2015-08-26 60 views
-1

我有一個大文件(arounf 80K行) 我的主要目標是找到模式和pring例如前10行和後10行模式。 該模式在整個文件中確認多次。 使用grep命令:匹配前後提取數據(BIG FILE)

grep -i <my_pattern>* -B 10 -A 10 <my_file> 

一些數據,我想那一定是一些有關緩衝區的大小我只得到....

我需要一個命令(的grep,sed的,AWK )將處理所有的匹配 並將打印10行之前和模式之後...

例子:

我的方式隱藏在這裏:

a 
b 
c 
pattern_234 
c 
b 
a 
a 
b 
c 
pattern_567 
c 
b 
a 

這發生在整個文件中多次。 運行此命令:

grep -i pattern_* -B 3 -A 3 <my_file> 

會得到他右輸出:

a 
b 
c 
c 
b 
a 
a 
b 
c 
c 
b 

它的工作原理,但沒有充分的時間 如果我有80種模式不是所有的80將顯示

+2

80K線什麼的grep和它需要做的唯一緩衝是針對10「之前」在比賽的錶殼線條。你能告訴我們你的模式和你期望匹配但是沒有的輸入數據樣本嗎? – jas

+0

jas我在主消息中添加了示例部分,希望它有幫助 – user3532371

+0

您的示例輸出排除了'pattern_ *'行。那是故意的嗎?你可以給我們一個例子,說明什麼時候'grep'不起作用? – John1024

回答

0

awk來救援

awk -vn=4      # pass the argument of context line count 
    '{ 
    for(i=1;i<=n;i++)  # store the past n lines in an indexed array 
     p[i]=p[i+1]; 
    p[n+1]=$0 
    } 

    /pattern/     # if pattern matched 
    { 
    c=n+1;     # set the counter to after match line count 
    for(i=1;i<=n;i++)  # print previously saved entries 
     print p[i] 
    } 
    c-->0'      # print the lines after match until counter runs out 

將打印4行之前和4裏在匹配模式之後,根據需要更改n的值。

如果非對稱的前/你需要經過兩個變量

awk -vb=2 -va=3 '{for(i=1;i<=b;i++) p[i]=p[i+1];p[b+1]=$0} /pattern/{c=a+1;for(i=1;i<=b;i++) print p[i]} c-->0' 
+0

喜卡拉,但如果前後的線數不相等? 例如:在比賽之前打印5行,之後打印6行.. – user3532371

+0

卡拉你可以請一個prief examplanation給awks的例子...它會幫助我很多...如果你可以請 – user3532371

+0

這打印模式爲好(我認爲這應該是默認使用情況)。您可以通過更改for循環終端條件來消除。該代碼不適合處理不同模式的重疊上下文。 – karakfa